今天介绍两种mysql主从同步跳过错误的方法:
一、两种方法介绍
1、跳过指定数量的事务:
mysql>slave stop;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 #跳过一个事务
mysql>slave start
2、修改mysql的配置文件,通过slave_skip_errors参数来跳所有错误或指定类型的错误
vi /etc/my.cnf
[mysqld]
#slave-skip-errors=1062,1053,1146 #跳过指定error no类型的错误
#slave-skip-errors=all #跳过所有错误
二、试验环节
下面模拟一个错误场景
1、环境(一个已经配置好的主从复制环境)
master数据库IP:192.168.0.201
slave数据库IP:192.168.0.202
mysql版本:8.0.23
binlog-do-db = mydb
2、在master上执行以下语句:
mysql>use mysql;
mysql>create table t1 (id int);
mysql>use mydb;
mysql>insert into mysql.t1 select 1;
在slave上查看复制状态
mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.0.200Master_User: slave1Master_Port: 3306Connect_Retry: 60Master_Log_File: master-bin.000084Read_Master_Log_Pos: 19843Relay_Log_File: slave-relay-bin.000004Relay_Log_Pos: 1982Relay_Master_Log_File: master-bin.000084Slave_IO_Running: YesSlave_SQL_Running: NoReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1146Last_Error: Error 'Table 'mysql.t1' doesn't exist' on query. Default database: 'mydb'. Query: 'insert into mysql.t1 select 1'Skip_Counter: 0Exec_Master_Log_Pos: 2319Relay_Log_Space: 2145Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_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: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 1146Last_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: 2013306Master_UUID: ed5a23af-1650-11ee-84bd-0242ac110002Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Master_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: 231210 21:37:19Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0
1 row in set (0.00 sec)
由结果可以看到,Read_Master_Log_Pos: 19843,Exec_Master_Log_Pos: 2319时出错了Last_SQL_Error: Error ‘Table ‘mysql.t1’ doesn’t exist’ on query.
因为只对mydb记录了binlog,当在mydb库操作其它数据库的表,但该表在slave上又不存在时就出错了。
如果在配置文件中忽略了该错误,则主从集群不会因为上述问题而停止工作。