Mysql5.6主從複製-基於binlog

zping發表於2015-08-20

MySQL5.6開始主從複製有兩種方式:基於日誌(binlog);基於GTID(全域性事務標示符)。

看MySQL的My.ini,看服務的啟動配置到那個配置檔案。

 

根據《爛泥:學習mysql資料庫主從同步複製原理》文章可知,mysql的主從同步複製過程如下:

1、主庫master在執行SQL語句之後,會把相關的SQL語句記錄到binlog檔案中。

2、從庫slave連線主庫master,並從主庫master獲取該binlog檔案,存於本地relay-log檔案中,然後從master.info檔案讀取上次同步時的pos位置節點起執行SQL語句。

由以上資訊可知,我們的mysql主從同步複製實驗,需要以下幾個步驟:

1、 配置主庫master同步複製時的選項

2、 在主庫master上建立同步複製時的使用者並授權

3、 主庫master鎖表

4、 記錄主庫master的binlog以及pos位置節點

5、 匯出ilanni資料庫

6、 配置slave端同步複製時所需要的選項

7、 在從庫slave上建立資料庫ilanni並匯入備份

8、 解鎖主庫表

9、 設定從庫slave與主庫master同步

10、 在從庫slave上開啟同步

11、 檢視從庫slave的relay-log以及master.info

12、 測試主從同步

此文章是基於日誌方式的配置步驟

環境:

master資料庫IP:192.168.247.128
slave資料庫IP:192.168.247.130
mysql版本:5.6.14

1.修改master配置檔案並重啟服務:

 

[mysqld]
server_id=1
binlog-ignore-db=test #不記錄binlog
replicate-ignore-db=test #不復制test庫的binlog
log-bin=mysql-bin
binlog_cache_size = 1M
binlog_format=mixed
expire_logs_days=3

其中log-bin=mysql-bin表示啟用mysql二進位制日誌,該項必須要啟用,否則mysql主從不會生效。

max_binlog_size=500M表示每個binlog檔案最大大小,當此檔案大小等於500M時,會自動生成一個新的日誌檔案。注意:一條記錄不會寫在2個日誌檔案中,所以有時日誌檔案會超過此大小。

server-id=1表示mysql伺服器ID,該ID必須在該主從中是唯一的,預設是1,該ID可以自行自定義,但必須為數字。

binlog-do-db=ilanni表示需要同步的資料庫名字,如果是多個資料庫,就以此格式再寫一行即可。

binlog-ignore-db=mysql表示不需要同步的資料庫名字,如果是多個資料庫,就以此格式再寫一行即可。

注意:如果binlog-do-db和binlog-ignore-db不加的話,那麼預設是同步複製整個mysql資料庫。

二、在主庫master上建立同步複製時的使用者並授權

登入master端,建立資料庫使用者ilanni,並授權為replication slave許可權。如下:

grant replication slave on *.* to 'ilanni'@'%' identified by '123456';

select user,repl_slave_priv from user where user='ilanni';



2.修改slave配置檔案並重啟服務:
[mysqld]
server_id=2
binlog-do-db = mydb
binlog-ignore-db=test #不記錄binlog
replicate-ignore-db=test #不復制test庫的binlog
log-bin=mysql-bin
binlog_cache_size = 1M
binlog_format=mixed
expire_logs_days=3


3.在master上建立用於複製的使用者
mysql>grant replication slave, replication client on *.* to 'repl'@'192.168.247.130' identified by 'pwd';

登入master端,建立資料庫使用者ilanni,並授權為replication slave許可權。如下:

 

我們可以看到目前資料庫使用者ilanni被授予replication slave許可權,在user表中的表現為repl_slave_priv欄位為Y。

注意:replication slave許可權:只有擁有此許可權的使用者才可以檢視從伺服器slave以及從主伺服器master讀取二進位制日誌的許可權。



4.備份master的資料

方法1:資料前先鎖表,保證資料一致性

先鎖住主庫master的表,防止資料再寫入,導致主從資料庫不一致。使用如下命令鎖表:

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+—————–+————+—————-+——————–+
|File             | Position   |  Binlog_Do_DB  |  Binlog_Ignore_DB  |  
+—————–+————+—————-+——————–+
|mysql-bin.000015 |       1273  |                |                    |
+—————–+————+—————-+——————–+
記錄檔名和pos號
開始備份資料庫
# mysqldump -uroot -p mydb > /tmp/mydb.sql
備份完畢,現在可以解鎖資料庫表

mysql> UNLOCK TABLES;

 

方法2:使用--lock-all-tables和--master-data引數結合,匯出資料

# mysqldump -uroot -p --hex-blob --lock-all-tables -R --triggers --databases mydb --master-data=2 --default-character-set='utf8' --quick> /tmp/mydb.sql

有關--master-data引數說明

 

匯出ilanni資料庫

在從庫slave與主庫master第一次同步資料時,有三種方法。

第一種方法就是在主庫鎖表後,使用tar把master庫直接打包,然後使用scp或者rsync把該打包檔案弄到從庫slave上。這種情況一般適用於網站或者業務在初始化,抑或在資料庫大於100G時建議使用。

第二種方法就是在主庫鎖表後,我們直接使用mysqldump命令匯出資料庫,然後在從庫上進行恢復。這個方法比較常見,所以我們一般是使用這個方法。

注意以上兩種方法,我們都需要進行在主庫master鎖表後進行操作。

第三種方法,其實我們不需要做其他工作。只需開啟同步複製即可。但是這個有一個前提就是,mysql的binlog必須齊全,這個齊全就是要包括該資料建立時的binlog也要存在。並且同步時,還必須要從最初始的binlog開始。所以,這種方法,我們一般不使用。

 

5.拷貝備份檔案到slave,並匯入

#scp /tmp/mydb.sql

#mysql -uroot -p -B mydb </tmp/mydb.sql

 

6.在slave上同步binlog

mysql>CHANGE MASTER TO MASTER_HOST='192.168.247.128',MASTER_USER='repl',MASTER_PASSWORD='pwd',MASTER_LOG_FILE='mysql-bin.000015',MASTER_LOG_POS=1273;

如果是方法2匯出的資料,則通過以下語句查詢binlog檔名和pos位置:

# grep -i "CHANGE MASTER TO" /tmp/mydb.sql
--CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=1273;


7.開啟複製
mysql> START slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

8.檢視slave狀態
mysql> show slave status\G

  Slave_IO_Running: YES
  Slave_SQL_Running: Yes

2個YES說明配置成功

Slave_IO_Running:連線到主庫,並讀取主庫的日誌到本地,生成本地日誌檔案
Slave_SQL_Running:讀取本地日誌檔案,並執行日誌裡的SQL命令。

如果Slave_IO_Running為NO,說明可能是從庫與主庫的網路不通。

如果Slave_SQL_Running為NO,說明很可能是從庫與主庫的資料不一致。

相關文章