環境:mysql
主機名 | 主機IP | 操做系統 | MySQL版本 |
---|---|---|---|
mysqlA | 172.16.4.235 | CentOS 6.5 |
mysql-community-server-5.7.5-0.6.m15.el6.x86_64 |
mysqlB | 172.16.4.236 | CentOS 6.5 |
mysql-community-server-5.7.5-0.6.m15.el6.x86_64 |
MySQL雙主+半同步架構搭建參考上一篇博文:http://qicheng0211.blog.51cto.com/3958621/1596131bash
本文作一點補充:若是mysqlA已經運行了一段時間,要添加一臺新的mysqlB,與mysqlA實現主主複製,就要先備份mysqlA上的數據導入到mysqlB,使數據保持一致;記錄mysqlA上binlog的文件名和Position,在mysqlB上執行change mater;再記錄mysqlB上binlog的文件名和Position,在mysqlA上執行change mater。
架構
下面有兩種實現方法:ide
方法1、spa
1)對mysqlA數據庫鎖表操做,不讓數據再進行寫入動做操作系統
> flush tables with read lock;
不要退出鏈接,另開一個終端執行備份操做。
日誌
2)備份mysqlA的數據庫server
mysqldump -uroot -p --single-transaction --opt --events --triggers --routines --flush-logs --master-data=2 --databases db1 db2 > db.sql
--flush-logs:選項用以生成新的二進制日誌文件。
--master-data:選項值等於2,備份後的sql文件裏CHANGE MASTER語句被註釋。
--single-transaction:InnoDB 表在備份時,一般啓用選項 --single-transaction 來保證備份的一致性,實際上它的工做原理是設定本次會話的隔離級別爲:REPEATABLE READ,以確保本次會話(dump)時,不會看到其餘會話已經提交了的數據。
3)看mysqlA數據庫的狀態,記錄File和Position項的值後解鎖。
> show master status; > unlock tables;
上圖所示二進制日誌文件爲mysql-bin.000002,位置爲120。
4)在mysqlB上導入mysqlA的數據
mysql -uroot -p'MNVq_YOg9' < db.sql
5)生成CHANGE MASTER語句,而後在mysqlB上執行
> STOP SLAVE; > CHANGE MASTER TO MASTER_HOST='172.16.4.235',MASTER_USER='repl_user',MASTER_PASSWORD='MNVq_YOg9',MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=120; > START SLAVE; > SHOW SLAVE STATUS\G
Slave_IO_Running和Slave_SQL_Running的狀態,若是都爲Yes,從庫mysqlB配置成功。
6)記錄mysqlB的File和Position項的值,生成CHANGE MASTER語句,而後在mysqlA上執行,啓動mysqlA的slave
略。
方法2、
1)備份A的數據庫(不用鎖表)
mysqldump -uroot -p --single-transaction --opt --events --triggers --routines --flush-logs --master-data=2 --databases db1 db2 > db.sql
2)使用grep命令查找二進制日誌的名稱以及位置
grep -i "change master" db.sql
上圖所示二進制日誌文件爲mysql-bin.000002,位置爲120。
而後執行方法一的4)、5)、6)便可。