mysql的主主復制詳解


Mysql雙主部署

解釋:

所謂雙主備份,其實也就是互做主從復制,每台master既是master,又是另一台服務器的slave。這樣,任何一方所做的變更,都會通過復制應用到另外一方的數據庫中。

 

要求:部署Mysql雙主復制,部署期間生產服務器可正常訪問,但無法進行登錄/注冊/退出等涉及到對Mysql寫的操作。

 

環境:

系統:centos 6.7

mysql版本:5.6.28

生產環境共2台mysql服務器(以下對兩台mysql分別簡稱為A B)

A:192.168.1.1   (master)

B:192.168.1.2      (slave)

 

部署前的准備

分別檢查A、B兩台Mysql服務器是否作為其他master的slave,並停止復制,以免受到影響。

#show slave status\G;

#mysql>stop slave;     

 

  • master(A庫) --->  slave(B庫)

 

開始部署

1. 同步數據:以A庫的數據為准,同步A B數據,使AB數據保持一致。

1.1 A中導出數據

(1)對A庫加鎖,避免同步時數據發生改變:

mysql>use database_name;

mysql> flush tables with read lock;                 #關閉所有打開的表,同時對於所有數據庫中的表都加一個讀鎖,直到顯示地執行unlock tables,該操作常常用於數據備份的時候。也就是將所有的臟頁都要刷新到磁盤,然后對所有的表加上了讀鎖,於是這時候直接拷貝數據文件也就是安全的。為此庫下的所有表施加讀鎖,退出會話后失效,所謂讀鎖,也就是只能讀,不能寫。

(2)使用mysqldump工具導出數據:

mysqldump -uroot -pxxx -R database_name >database_name.sql        # -R參數表示同時備份函數

(3)記下binlog日志中Position的位置(用於slave連接A做復制時會用到)

mysql> show master status\G;             # mysql-bin.000003  pos=443

(4)解鎖數據庫:

mysql>unlock tables;

1.2 將A備份的數據導入到B中

[root@localhost ~]# mysql -uroot -pxxx < database_name.sql

 

2. 配置Master(A)

(1)master中創建一個僅用於主從復制的賬號,給與REPLICATION SLAVE權限。此權限僅允許slave訪問Master的bin-log日志。

在Master中創建一個僅用於復制的mysql用戶,並僅給與復制權限。

mysql> create user 'repl_A'@'192.168.1.2' identified by '123';

mysql> grant replication slave on *.* to 'repl_A'@'192.168.1.2';

mysql>grant replication slave on *.* to ‘repl_A’@ ‘192.168.1.2’ identified by ‘123’;    #上面兩句可以直接簡略為這一句。

 

(2)master開啟二進制日志

vim /etc/my.cnf 或者 vim /usr/my.cnf (在[mysqld]下添加:)

 

server-id=1                       #指定master主機的id,不可為0,否則拒絕所有slave連接。

log-bin=mysql_bin                  #指定bin-log文件前綴名稱,開啟binlog日志

binlog_do_db=database_name        #指定binlog日志是記錄的是哪個庫

replicate-do-db=database_name       #指定復制哪一個庫

auto-increment-increment = 2   //每次增長2

auto-increment-offset = 1  //設置自動增長的字段的偏移量,即初始值為1

log_bin_trust_function_creators=1            #詳解如下方

expire_logs_days = 10            #保留10天的bin_log日志,防止日志太多占用磁盤空間

max_binlog_size = 100M              #限制每個bin_log日志大小最大為100M。

log-slave-updates=1        #slave執行master的sql后,將sql記錄在binlog日志中(默認是不記錄的)——實際生產我沒開啟這條

max_connections=600             #指定最大連接數

wait_timeout=5                       #等待超時

 

 

#重啟mysql使配置生效。

 

3. 配置Slave(B)

(1)配置slave的server-id

  示例:[root@iZ2z usr]# vim my.cnf             

       [mysqld]

             server-id=2      

    auto-increment-increment = 2  //每次增長2

     auto-increment-offset = 2 //設置自動增長的字段的偏移量,即初始值為2

注:二都只有server_id不同和 auto-increment- offset不同
  auto-increment-increment的值應設為整個結構中服務器的總數,本案例用到兩
  台服務器,所以值設為2。

重啟mysql使配置生效。

 

(2)配置連接master的相關信息配置。

在slave中指定master相關參數。

你可以一行一行的配置master連接信息。

mysql>change master to master_host='192.168.1.1',  #指定master主機IP地址

>master_user='repl_A',          #指定一個(在master中)有復制權限的用戶

>master_port=3306,                               

>master_password='123',                           #指定上述有復制權限用戶的密碼

>master_log_file='mysql-bin.000003',       #指定開始復制的binlog二進制文件。

>master_log_pos=443;           #指定(在master二進制文件中)要開始復制的位置。#注意:  master_log_pos的值無需加引號,否則報錯

或者

將master連接信息配置寫在一行。

mysql>change master to master_host='192.168.1.1',master_user='repl',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=443;

 

解釋:

連接master的配置信息在命令行中配置好后,默認存在/var/lib/mysql/master.info文件,可以使用show master status\G;命令查看,所有就算重啟也不用擔心連接master的配置丟失。

 

(3)開啟slave

slave中:start slave;

Slave_IO_Running和Slave_SQL_Running的狀態都是YES,說明同步開啟成功。

 

 

 

  • master(B庫) --->  slave(A庫)

 

Master(B)配置

(1)master中創建一個僅用於主從復制的賬號

mysql> grant  REPLICATION SLAVE  on  *.*  to  'repl_B'@'192.168.1.1'  identified by  '123';

 

(2)查看B庫中binlog日志的位置

mysql> show master status\G;             # mysql_bin.000004   pos=558

 

(3)同步數據

mysql>change master to master_host='192.168.1.2', 

>master_user='rel_B, 

>master_port=3306,      

>master_password='123',  

>master_log_file='mysql_bin.000004', 

>master_log_pos=558;                                                                       

 

(4)開啟slave

A(slave)庫中:start slave;

 

(5)測試驗證

 

解釋:

log_bin_trust_function_creators=1  

當二進制日志啟用后,這個變量就會啟用。它控制是否可以信任存儲函數創建者,不會創建寫入二進制日志引起不安全事件的存儲函數。如果設置為0(默認值),用戶不得創建或修改存儲函數,除非它們具有除CREATE ROUTINE或ALTER ROUTINE特權之外的SUPER權限。如果變量設置為1,MySQL不會對創建存儲函數實施這些限制。 此變量也適用於觸發器的創建。

server-id=1    

原理:在master中,您必須配置一個獨特的服務器ID(可能需要重新啟動服務器)和啟用二進制日志,slave的復制基於master的二進制日志。如果沒有使用log-bin選項啟用二進制日志,復制是不可能的。每個slave與master必須配置一個獨特的ID。這個ID用於識別主從服務器,而且必須是一個正整數1和(232)−1之間。

 

驗證:

1. ls /var/lib/mysql/ 會發現有mysql-bin.000001mysql、mysql-bin.index ,表示啟用二進制日志成功。

 

mysql_bin.000001:         Master記錄操作的二進制日志文件。

mysql_bin.index:     二進制文件的索引文件,存放二進制日志文件的名字和路徑。

2. 命令查看

#查看否開啟了bin-log     mysql> show variables like '%log_bin%'; 

#查看bin-log相關參數     mysql> show variables like '%binlog%';

#當前mysql二進制日志文件的默認位置       mysql> show variables like '%datadir%';

#查看mysql二進制文件名稱及大小                     mysql> show binary logs;

 

3. Master常用命令

#查看Master復制狀態             mysql> show master status;

#查看二進制日志文件事件內容 mysqlbinlog mysql-bin.xxx        ---可讀性差

#查看二進制日志文件事件內容 mysql> show binlog events in 'mysql-bin.000003';

 

4. 管理二進制日志文件     

#刪除二進制日志文件

手動刪除:

語法:                   > PURGE {MASTER | BINARY} LOGS TO 'log_name'

                             > PURGE {MASTER | BINARY} LOGS BEFORE 'date'

                             #我使用時沒發現MASTER 和BINARY的區別,都一樣用,都可以。

mysql> purge binary logs to 'mysql_bin.000002';             

//刪除mysql_bin.000002之前的二進制日志文件,並同步刪除日志索引文件mysql_bin.index中mysql_bin.000002之前的索引信息。注意不包含mysql_bin.000002

 

mysql> purge master logs before '2017-07-20 21:58:00';              //清除2017-07-20 21:58:00 之前的二進制日志,並同步清楚日志索引文件的信息。

 

自動刪除:

my.cnf中加入以下,然后重啟:

SET GLOBAL expire_logs_days = 7              \\設置二進制日志只保留7天的

                             -------如果不想重啟直接mysql> SET GLOBAL expire_logs_days = 7

 

#重置master二進制日志文件及內容     

mysql> reset master;

或者是  

mysql>flush logs;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM