說明:mysql
系統:centos7
主庫 M:192.168.16.12:3306
從庫 S:192.168.16.15:3306
主從複製:傳統複製sql
M、S目前基於log、pos點的複製,想要將其在線切換爲基於GTID的複製,
操做步驟(M、S都需執行,哪一個先不影響):centos
一、M、S:mysql> set @@global.enforce_gtid_consistency=warn; 二、M、S:mysql> set @@global.enforce_gtid_consistency=on; 三、M、S:mysql> SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE; 四、M、S:mysql> SET @@GLOBAL.GTID_MODE = on_permissive; 五、M、S:Mysql> SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT'; //是否=0 六、M、S:mysql> SET @@GLOBAL.GTID_MODE = ON; 七、M、S:修改配置文件
配置完成後查看slave狀態:ide
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.16.12 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000079 Read_Master_Log_Pos: 584132 Relay_Log_File: relay-log.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000079 Slave_IO_Running: Yes Slave_SQL_Running: Yes Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 584132 Relay_Log_Space: 4 Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 58343797-e7f4-11e8-9c78-246e968f00b0 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: System lock Master_Retry_Count: 86400 Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: 58343797-e7f4-11e8-9c78-246e968f00b0:1-442 Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)
Master_Log_File: mysql-bin.000079 Read_Master_Log_Pos: 584132 Executed_Gtid_Set: 58343797-e7f4-11e8-9c78-246e968f00b0:1-442
Slave_IO_Running: 由Yes變爲 Connectingcentos7
2018-11-21T10:00:46.981201+08:00 2803 [Note] Error reading relay log event for channel '': slave SQL thread was killed 2018-11-21T10:00:46.981503+08:00 2802 [Note] Slave I/O thread killed while waiting to reconnect after a failed read for channel '' 2018-11-21T10:00:46.981522+08:00 2802 [Note] Slave I/O thread exiting for channel '', read up to log 'mysql-bin.000079', position 584132 2018-11-21T10:00:58.950843+08:00 2808 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. 2018-11-21T10:00:58.951239+08:00 2809 [Note] Slave SQL thread for channel '' initialized, starting replication in log 'mysql-bin.000079' at position 584132, relay log '/data/mysql/relay-log.000001' position: 4 2018-11-21T10:00:58.951370+08:00 2808 [Note] Slave I/O thread for channel '': connected to master 'slave@192.168.16.12:3306',replication started in log 'mysql-bin.000079' at position 584132
master errror log:日誌
[Note] While initializing dump thread for slave with UUID <30525ae8-e7f4-11e8-9af5-246e968f0048>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(9549). 2018-11-21T09:59:20.506354+08:00 2168119 [Note] While initializing dump thread for slave with UUID <30525ae8-e7f4-11e8-9af5-246e968f0048>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(2167205). 2018-11-21T10:03:42.429940+08:00 2168119 [Note] Start binlog_dump to master_thread_id(2168119) slave_server(2), pos(, 4)
此時master可能執行了一個大的insert or update,超過了30s master沒有推送binlog給slave。致使slave重連。
slave 過了 slave-net-timeout(30)秒尚未收到主庫來的數據,它就會開始第一次重試。重試的過程當中,連上了主庫,那麼它認爲當前主庫是好的
而後再過 30s 則再一次重連主庫。
因此此時纔看到master上有多個slave的進程。code
將slave-net-timeout調大,設置爲1小時
mysql> set global slave-net-time=3600;orm
看到二 出現的現象後,作了以下操做:server
stop slave; change master to master_user='192.168.16.12',master_port=3306,master_user='slave',master_password='',master_auto_position=1; start slave;
此時查看slave的狀態以下:進程
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.16.12 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: Read_Master_Log_Pos: Relay_Log_File: relay-log.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000079 Slave_IO_Running: Yes Slave_SQL_Running: Yes Master_Server_Id: 1 Master_UUID: 58343797-e7f4-11e8-9c78-246e968f00b0 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: System lock Master_Retry_Count: 86400 Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: 58343797-e7f4-11e8-9c78-246e968f00b0:1-442 Auto_Position: 1 1 row in set (0.00 sec)
slave沒法找到master的file、pos位置點,會從master最開始的binlog進行讀取,slave的日誌以下:
[Note] Slave SQL thread for channel '' initialized, starting replication in log 'FIRST' at position 0, relay log '/data/mysql/relay-log.000001' position: 4 2018-11-21T10:05:47.912953+08:00 2820 [Note] Slave I/O thread for channel '': connected to master 'slave@192.168.16.12:3306',replication started in log 'FIRST' at position 4 2018-11-21T10:57:52.722093+08:00 31 [ERROR] Error reading packet from server for channel '': Cannot replicate anonymous transaction when AUTO_POSITION = 1, at file /data/mysql/mysql-bin.000003, position 194.; the first event '' at 4, the last event read from '/data/mysql/mysql-bin.000003' at 259, the last b yte read from '/data/mysql/mysql-bin.000003' at 259. (server_errno=1236) 2018-11-21T10:57:52.722133+08:00 31 [ERROR] Slave I/O for channel '': Got fatal error 1236 from master when reading data from binary log: 'Cannot replicate anonymo us transaction when AUTO_POSITION = 1, at file /data/mysql/mysql-bin.000003, position 194.; the first event '' at 4, the last event read from '/data/mysql /mysql-bin.000003' at 259, the last byte read from '/data/mysql/mysql-bin.000003' at 259.', Error_code: 1236
此時須要先關閉auto_position,再設置file、pos點,最後再開啓auto_position=1,具體以下:
set global slave-net-time=3600; stop slave; change master to master_auto_position=0; change master to master_user='192.168.16.12',master_port=3306,master_user='slave',master_password='',master_log_file=mysql-bin.000079,master_log_pos=584132; change master to master_auto_position=1; start slave;
再次查看slave的狀態,能夠看到狀態正常:
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.16.12 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000079 Read_Master_Log_Pos: 175299608 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 34778333 Relay_Master_Log_File: mysql-bin.000079 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 35362051 Relay_Log_Space: 174716091 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 3317 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 58343797-e7f4-11e8-9c78-246e968f00b0 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: System lock Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: 58343797-e7f4-11e8-9c78-246e968f00b0:443-20481 Executed_Gtid_Set: 58343797-e7f4-11e8-9c78-246e968f00b0:1-4431 Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)