CHANGE MASTER TO命令用於slave配置連接master的信息,例如master host、master port等。
關於CHANGE MASTER TO命令,總結幾點使用心得。
-
在CHANGE MASTER TO之前,slave 的復制線程(I/O線程,SQL線程)必須停止,可以使用 STOP SLAVE 來停止。
-
如果一些參數不指定,則其參數值使用以前設置的值。
-
如果使用了參數RELAY_LOG_FILE 或者RELAY_LOG_POS,relay log文件會被保留, relay_log_purge全局變量被設置為0.
否則,會刪除所有的relay log文件,創建一個新的relay log文件。 -
在執行CHANGE MASTER TO ... MASTER_AUTO_POSITION = 1使用gtid之前,
gtid_mode必須開啟,否則會報錯。 -
某個實例已經開啟GTID,如果指向新主庫,使用的命令
CHANGE MASTER TO只帶MASTER_HOST、MASTER_PORT兩個參數,會根據GTID自動定位位置開始復制。 -
5.7.4以前的版本,使用CHANGE MASTER TO時如果沒有帶參數MASTER_HEARTBEAT_PERIOD,默認會將MASTER_HEARTBEAT_PERIOD設置成slave_net_timeout的一半,並將Slave_received_heartbeats 設置為0.
目前,只有使用RESET SLAVE才會將heartbeat周期重置。這個地方是有疑問的。 -
slave_net_timeout修改后, MASTER_HEARTBEAT_PERIOD不會自動跟着修改,需要重新change master to。
關於MASTER_HEARTBEAT_PERIOD的疑問
測試版本:5.7.21
兩種情況的測試:
-
CHANGE MASTER TO只帶MASTER_HOST、MASTER_PORT兩個參數時,
MASTER_HEARTBEAT_PERIOD會變為slave_net_timeout的一半。符合預期。 -
CHANGE MASTER TO只帶參數MASTER_CONNECT_RETRY時,
MASTER_HEARTBEAT_PERIOD不變。不符合預期。
測試過程
測試1
首先設置slave_net_timeout為50:
mysql> set global slave_net_timeout=50;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'slave_net_timeout';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| slave_net_timeout | 50 |
+-------------------+-------+
1 row in set (0.00 sec)
接着change master to
change master to MASTER_HOST='127.0.0.1', MASTER_PORT=3306;
查看hearbeat,可以看到heartbeat變為了slave_net_timeout的一半,25:
mysql> select * from mysql.slave_master_info\G
*************************** 1. row ***************************
... ...
Heartbeat: 25
... ...
1 row in set (0.00 sec)
測試2
首先設置slave_net_timeout為80:
mysql> set global slave_net_timeout=80;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'slave_net_timeout';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| slave_net_timeout | 80 |
+-------------------+-------+
1 row in set (0.00 sec)
接着change master to
change master to MASTER_CONNECT_RETRY=100;
查看heartbeat, 仍然是25,沒有變化:
mysql> select * from mysql.slave_master_info\G
*************************** 1. row ***************************
... ...
Connect_retry: 100
... ...
Heartbeat: 25
... ...