在實作 MySQL 的複寫(Replication) 的時候必須注意 MySQL 5.5 之後所使用的設定方式並不相同,必須分清楚這一塊
在 MySQL Replication 的實作方式有很多種,這篇是實作 CentOS 6.7 – MySQL 5.6 單向複寫
Master:
接收執行指令(SELECT、UPDATE、INSERT … )
Slave:
僅查詢指令(SELECT)
由 Slave 主動向 Master 取得同步更新資料(由此規則所以 Slave 可以擁有多台,並且非同步複寫,即使中斷連線再恢復也可以回復資料庫同步的狀況。
資料庫複寫在以往通常使用廣泛用於:資料庫備份、分析
本篇範例至少需要兩台資料庫伺服器:
Master 伺服器:192.168.10.10
Slave 伺服器:192.168.10.11
MySQL 5.6 單向複寫資料庫實作
Master 設定
Step.1 在 Master 的 my.cnf 中 [mysqld] 加入以下複寫全部資料庫
[mysqld] #bind-address = 127.0.0.1 server-id=1 log-bin=mysql-bin
- 預設 mysql 僅會繫結本機網路,所以必須註解
- server-id 與你的 slave 不可以重複
- log-bin 是要用來提供 slave restore 的 log
如果你只想複寫其中幾個資料庫可以使用 binlog-do-db 來指定資料庫
[mysqld] #bind-address = 127.0.0.1 server-id=1 log-bin=mysql-bin binlog-do-db = db1 binlog-do-db = db2
Step.2 重新啟動 Mysql 檢測 Master 運作並確認有產生 mysql-bin 的 log
$ service mysql restart $ mysql -uroot -p mysql> SHOW MASTER STATUS \G; *************************** 1. row *************************** File: mysql-bin.000004 Position: 7016 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.01 sec)
Step.3 建立 Replication 使用者
mysql> GRANT replication slave ON *.* TO repluser@192.168.10.11 identified BY 'replpass'; mysql> flush privileges;
在這邊請僅允許 SLAVE IP 即可。
Step.4 將 Master 的資料庫匯出,準備提供給 SLAVE 初始化資料庫使用
$ mysqldump -u root -p --master-data --all-databases > repl_db.sql
請注意 –master-data 是提供給 Master 匯出資料給 SLAVE 用的。
SLAVE 設定
Step.1 將 Master 匯出的 repl_db.sql 匯入
$ mysql -u root -p --default-character-set=utf8 < repl_db.sql
Step.2 設定 my.cnf,重啟 Mysql
$ vim /etc/my.cnf [mysqld] server-id=2 $ service mysqld restart
如果你的 SLAVE 也需要複寫至其他 SLAVE 也可將 log-bin 參數加入
Step.3 SLAVE 的複寫設定
填入 Master 所設定的複寫帳號、主機
$ mysql -uroot -p mysql> CHANGE MASTER TO MASTER_HOST='192.168.10.10', MASTER_PORT=3306, MASTER_USER='repluser', MASTER_PASSWORD='replpass';
Step.4 啟動 SLAVE 複寫機制
mysql> START SLAVE;
Step.5 檢測 SLAVE 複寫狀況
mysql> SHOW SLAVE STATUS \G; Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error:
確認沒有錯誤就可以在 Master 上建立資料庫或者 UPDATE、INSERT 的動作,通通都會立即在 SLAVE 上同步!
參考資料:
如何在 MySQL 5.5 設定單向資料庫複寫機制 (Replication)