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
匯出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,說明很可能是從庫與主庫的資料不一致。