当前位置: 代码迷 >> MySQL >> mysql主从复制跳过异常
  详细解决方案

mysql主从复制跳过异常

热度:122   发布时间:2016-05-05 17:12:05.0
mysql主从复制跳过错误

mysql主从复制,经常会遇到错误而导致slave端复制中断,这个时候一般就需要人工干预,跳过错误才能继续
跳过错误有两种方式:
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#跳过所有错误



例:下面模拟一个错误场景
环境(一个已经配置好的主从复制环境)
master数据库IP:192.168.247.128
slave数据库IP:192.168.247.130
mysql版本:5.6.14
binlog-do-db = mydb


在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 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)


由结果可以看到,Read_Master_Log_Pos: 2341,Exec_Master_Log_Pos: 1919 时出错了Last_SQL_Error: Error 'Table 'mysql.t1' doesn't exist' on query.
因为只对mydb记录了binlog,当在mydb库操作其它数据库的表,但该表在slave上又不存在时就出错了。


我们可在看看binlog里的事务内容,这里一行代表一个事务
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)




由上面的结果可知,我们需要跳过两个事务(Pos: 1999 ?insert,Pos: 2103 ?commit)
跳过操作:
mysql>slave stop;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2 ? ? ? ?跳过一个事务
mysql>slave start
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)


复制状态正常。

  相关解决方案