一、祖傳的master_log_file + master_log_pos的復制方式面臨的問題:
在很久以前 那個時候我還沒有出道,mysql就已經就有復制這個功能了。如果要告訴slave庫從master二進制日志的哪個
地方開始復制,就要通過change master to 的master_log_file & master_log_pos 參數來指定。但是這個有個問題,就
是在slave出現問題后,slave要從那個地方開始重新同步呢?這個時候就比較小心了,因為show slave status 中對於文件
名和位置的返回有三組。
Master_Log_File: mysql-bin.000052 Read_Master_Log_Pos: 190 Relay_Log_File: 74cstudio-relay-bin.0000031 Relay_Log_Pos: 355 Relay_Master_Log_File: mysql-bin.000050 Exec_Master_Log_Pos: 77
如果dba在重新同步時指定的master_log_file + master_log_pos 參數不對,那么就會引起數據的不一致,而且這個不一致還
不太好發現。
二、gtid出現了:
1、有了gtid了之后對於重新同步時slave從哪里開始同步master的binlog不在由dba來管了,省心了!
2、有了gtid了之后只要對比一下master和slave上的gtid數據量就可以知道master和slave是否一致了!
三、gtid這么吊 怎么建立一個基於gtid的復制呢?:
根據官方文檔要把復制方式從master_log_file + master_log_pos 換到基於gtid的復制,要經過如下幾步:
1、把master和slave都設置為read_only 這樣做是為了slave能同步所有master上的已有更新,同步完成之后
slave的數據量就是等於master的數據量了。
2、關閉master 和 slave
3、開啟master 和 slave 上的gtid功能 、開啟read_only 功能。這都通過my.cnf文件配置下就行啦。
4、啟動master 和 slave
5、讓slave 以gtid的方式同步
6、設置master 和 slave 可寫
四、舉例:
還是先看一下已有master -> slave 環境的相關信息:
mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.192.10 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000005 Read_Master_Log_Pos: 190 Relay_Log_File: 74cstudio-relay-bin.000003 Relay_Log_Pos: 355 Relay_Master_Log_File: mysql-bin.000005 Slave_IO_Running: Yes Slave_SQL_Running: Yes
1、設置master 和 slave 為只讀:
master:
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> set @@global.read_only=1; Query OK, 0 rows affected (0.00 sec)
slave:
mysql> set @@global.read_only=1; Query OK, 0 rows affected (0.00 sec)
2、等slave完全同步了所有的master的更新后就關閉master 和 slave:
master:
[root@74cstudio mysql]# mysqladmin -uroot shutdown
slave:
[root@74cstudio mysql]# mysqladmin -uroot shutdown
3、開啟master 和 slave 上的gtid功能並把它們設置成read_only
master
[mysqld] gtid_executed_compression_period =1000 # 1000 gtid_mode =on # off enforce_gtid_consistency =on # off read_only =1 # off
slave
[mysqld] gtid_executed_compression_period =1000 # 1000 gtid_mode =on # off enforce_gtid_consistency =on # off read_only =1 # off
4、啟動master 和 slave
master
[root@cstudio mysql]# systemctl start mysql
slave
[root@cstudio mysql]# systemctl start mysql
5、讓slave 以gtid的方式同步
slave
mysql> change master to -> master_host='172.16.192.10', -> master_port=3306, -> master_user='repl', -> master_password='repl@352', -> master_auto_position=1; Query OK, 0 rows affected, 2 warnings (0.00 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec)
6、把master 和 slave 設置為可寫
master
mysql> set @@global.read_only=0; Query OK, 0 rows affected (0.00 sec) mysql> show global variables like 'read_only'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | read_only | OFF | +---------------+-------+
slave
mysql> set @@global.read_only=0; Query OK, 0 rows affected (0.00 sec) mysql> show global variables like 'read_only'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | read_only | OFF | +---------------+-------+
7、還是show slave status 看一下slave 同步的狀態作為結束
mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.192.10 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 509 Relay_Log_File: 74cstudio-relay-bin.000005 Relay_Log_Pos: 714 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes Auto_Position: 1
五、用gtid同步時可以方便的校對數據的一致性:
master上看執行哪些事務
mysql> show master status \G *************************** 1. row *************************** File: mysql-bin.000006 Position: 509 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 49d1e2c1-a8bc-11e7-8f4e-000c296c32b0:1-10 1 row in set (0.00 sec)
slave上看執行了哪些事務
mysql> show master status \G *************************** 1. row *************************** File: mysql-bin.000006 Position: 509 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 49d1e2c1-a8bc-11e7-8f4e-000c296c32b0:1-10 1 row in set (0.00 sec)
由上面可以看出兩次執行show master status \G 的輸出中Executed_Gtid_Set的值是一樣的,說明master上的每一個事務都
有在slave 上執行,所以可以得出master 和 slave是一致的結論。
六、在執行master_log_file + master_log_pos 到 gtid 同步方式的變更時的注意項:
1、在四.2中那個關閉master 和 slave 的時候一定要確定slave 已經應用了master 的所以變更。
2、在四.4中最好先把slave設置成skip-slave-start=1 , 不然會發現在執行change master to 的時候會報slave 已經啟動了
當然這個報錯可能通過先執行stop slave 然后再執行change master to 來規避。
七、最后還是說一下什么是gtid:
gtid 這個哥們的中文全稱叫 “全局事務ID”,說白了就是事務的“身份證號碼”. 快10點了不想多說了。
----------------------------------------------------------------------
-----------------------------------------------------------------------