mysql master-slave replication, often encounter errors and lead to slave end replication interruption, this time generally requires manual intervention, skip errors to continue
There are two ways to skip errors:
1.1 Skip a specified number of transactions:
mysql>stop slave; mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; #Skip a transaction mysql>start slave;
1.2 Modify mysql configuration file to skip all errors or specified types of errors through the slave_skip_errors parameter
vi /etc/my.cnf [mysqld] #slave-skip-errors=1062,1053,1146 #Skip the error of the specified error no type #slave-skip-errors=all #Skip all errors
2 cases
Let's simulate an error scenario
Environment (a configured master-slave replication environment)
master database IP: 192.168.247.128
Slve database IP: 192.168.247.130
mysql version: 5.6.14
binlog-do-db = mydb
Execute the following statement on master:
mysql>use mysql; mysql>create table t1 (id int); mysql>use mydb; mysql>insert into mysql.t1 select 1;
View replication status on slave
mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.247.128 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000017 Read_Master_Log_Pos: 2341 Relay_Log_File: DBtest1-relay-bin.000011 Relay_Log_Pos: 494 Relay_Master_Log_File: mysql-bin.000017 Slave_IO_Running: Yes Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1146 Last_Error: Error 'Table 'mysql.t1' doesn't exist' on query. Default database: 'mydb'. Query: 'insert into mysql.t1 select 1' Skip_Counter: 0 Exec_Master_Log_Pos: 1919 Relay_Log_Space: 1254 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: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 1146 Last_SQL_Error: Error 'Table 'mysql.t1' doesn't exist' on query. Default database: 'mydb'. Query: 'insert into mysql.t1 select 1' Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: f0f7faf6-51a8-11e3-9759-000c29eed3ea Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: 131210 21:37:19 Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 1 row in set (0.00 sec)
As can be seen from the results, Read_Master_Log_Pos: 2341, Exec_Master_Log_Pos: 1919 error Last_SQL_Error: Error'Table'mysql.t1'does't exist' on query.
Because only binlog is recorded for mydb, errors occur when tables in other databases are operated on the mydb library but do not exist on slave.
Let's look at the transaction content in the binlog, where a row represents a transaction.
mysql> SHOW BINLOG EVENTS in 'mysql-bin.000017' from 1919\G *************************** 1. row *************************** Log_name: mysql-bin.000017 Pos: 1919 Event_type: Query Server_id: 1 End_log_pos: 1999 Info: BEGIN *************************** 2. row *************************** Log_name: mysql-bin.000017 Pos: 1999 Event_type: Query Server_id: 1 End_log_pos: 2103 Info: use `mydb`; insert into mysql.t1 select 1 *************************** 3. row *************************** Log_name: mysql-bin.000017 Pos: 2103 Event_type: Xid Server_id: 1 End_log_pos: 2134 Info: COMMIT /* xid=106 */ *************************** 4. row *************************** Log_name: mysql-bin.000017 Pos: 2134 Event_type: Query Server_id: 1 End_log_pos: 2213 Info: BEGIN *************************** 5. row *************************** Log_name: mysql-bin.000017 Pos: 2213 Event_type: Query Server_id: 1 End_log_pos: 2310 Info: use `mydb`; insert into t1 select 9 *************************** 6. row *************************** Log_name: mysql-bin.000017 Pos: 2310 Event_type: Xid Server_id: 1 End_log_pos: 2341 Info: COMMIT /* xid=107 */ 6 rows in set (0.00 sec)
From the above results, we need to skip two transactions (Pos: 1999 insert, Pos: 2103 commit)
Skip operation:
mysql>stop slave; mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2; Skip a transaction mysql>start slave; mysql> show slave status\G ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 3 Current database: mydb *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.247.128 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000017 Read_Master_Log_Pos: 3613 Relay_Log_File: DBtest1-relay-bin.000018 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000017 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: 3613 Relay_Log_Space: 458 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: 0 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: f0f7faf6-51a8-11e3-9759-000c29eed3ea Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 1 row in set (0.01 sec)
The replication status is normal.