mysql的主主複製詳解

Mysql雙主部署mysql

解釋:sql

所謂雙主備份,其實也就是互作主從複製,每臺master既是master,又是另外一臺服務器的slave。這樣,任何一方所作的變動,都會經過複製應用到另一方的數據庫中。數據庫

 

要求:部署Mysql雙主複製,部署期間生產服務器可正常訪問,但沒法進行登陸/註冊/退出等涉及到對Mysql寫的操做。vim

 

環境:centos

系統:centos 6.7安全

mysql版本:5.6.28服務器

生產環境共2臺mysql服務器(如下對兩臺mysql分別簡稱爲A B)ide

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;

相關文章
相關標籤/搜索