bitsCN.com

大家都知道,当slave出现错误时,可以通过SET GLOBAL sql_slave_skip_counter = N来跳过错误,但是这个N,又真正代表什么呢。

This statement skips the next N events from the master
即他是跳过N个events,这里最重要的是理解event的含义
在mysql中,对于sql的 binary log 他实际上是由一连串的event组成的一个组,即事务组。
我们在master上可以通过
SHOW BINLOG EVENTS 来查看一个sql里有多少个event。
通过例子来说明下,真正的event的含义:
在slave上
show slave status
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '193' for key 'PRIMARY'' on query. Default database: 'ssldb'. Query: 'insert slave_no_skip1 values (193,'y10')'
Skip_Counter: 0
在 master 上,执行
mysql> SHOW BINLOG EVENTS in 'mysql-bin.000010' from 46755013;
+------------------+----------+------------+-----------+-------------+--------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+----------+------------+-----------+-------------+--------------------------------------------------------+
| mysql-bin.000010 | 46755013 | Query | 1 | 46755082 | BEGIN |
1| mysql-bin.000010 | 46755082 | Query | 1 | 46755187 | use `ssldb`; insert slave_no_skip1 values (193,'y10') |
2| mysql-bin.000010 | 46755187 | Xid | 1 | 46755214 | COMMIT /* xid=4529451 */ |
3| mysql-bin.000010 | 46755214 | Query | 1 | 46755283 | BEGIN |
4| mysql-bin.000010 | 46755283 | Query | 1 | 46755387 | use `ssldb`; insert slave_no_skip1 values (194,'y11') |
5| mysql-bin.000010 | 46755387 | Xid | 1 | 46755414 | COMMIT /* xid=4529452 */ |
6| mysql-bin.000010 | 46755414 | Query | 1 | 46755483 | BEGIN |
7| mysql-bin.000010 | 46755483 | Query | 1 | 46755587 | use `ssldb`; insert slave_no_skip1 values (195,'y12') |
8| mysql-bin.000010 | 46755587 | Xid | 1 | 46755614 | COMMIT /* xid=4529453 */ |
9| mysql-bin.000010 | 46755614 | Query | 1 | 46755683 | BEGIN |
10| mysql-bin.000010 | 46755683 | Query | 1 | 46755788 | use `ssldb`; insert slave_no_skip1 values (196,'y13') |
11| mysql-bin.000010 | 46755788 | Xid | 1 | 46755815 | COMMIT /* xid=4529454 */ |
12| mysql-bin.000010 | 46755815 | Query | 1 | 46755884 | BEGIN |
13| mysql-bin.000010 | 46755884 | Query | 1 | 46755989 | use `ssldb`; insert slave_no_skip1 values (197,'y14') |
14| mysql-bin.000010 | 46755989 | Xid | 1 | 46756016 | COMMIT /* xid=4529455 */ |
15| mysql-bin.000010 | 46756016 | Query | 1 | 46756085 | BEGIN |
16| mysql-bin.000010 | 46756085 | Query | 1 | 46756190 | use `ssldb`; insert slave_no_skip1 values (198,'y15') |
17| mysql-bin.000010 | 46756190 | Xid | 1 | 46756217 | COMMIT /* xid=4529456 */ |
18| mysql-bin.000010 | 46756217 | Query | 1 | 46756286 | BEGIN |
19| mysql-bin.000010 | 46756286 | Query | 1 | 46756391 | use `ssldb`; insert slave_no_skip1 values (199,'y16') |
20| mysql-bin.000010 | 46756391 | Xid | 1 | 46756418 | COMMIT /* xid=4529457 */ |
21| mysql-bin.000010 | 46756418 | Query | 1 | 46756487 | BEGIN |
22| mysql-bin.000010 | 46756487 | Query | 1 | 46756592 | use `ssldb`; insert slave_no_skip1 values (190,'y17') |
| mysql-bin.000010 | 46756592 | Xid | 1 | 46756619 | COMMIT /* xid=4529458 */ |
+------------------+----------+------------+-----------+-------------+--------------------------------------------------------+
24 rows in set (0.00 sec)
通过错误可知,他是use `ssldb`; insert slave_no_skip1 values (193,'y10') 这条语句导致错误了
如果我们想跳到最后一条语句“use `ssldb`; insert slave_no_skip1 values (190,'y17')“的话 ,我们必须简单计算下中间有多少个event
很明显,是21,那么我们可以执行SET GLOBAL sql_slave_skip_counter =21(这里你SET GLOBAL sql_slave_skip_counter =19或者20都可以)
在slave 在次执行show slave status查看
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '190' for key 'PRIMARY'' on query. Default database: 'ssldb'. Query: 'insert slave_no_skip1 values (190,'y17')'
Skip_Counter: 0
可见 他已经如我所愿,跳到use `ssldb`; insert slave_no_skip1 values (190,'y17')这里了。
以下是我遇到的情况,同事在试命令.搞的同步出错.
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: 1103
Last_Error: Error 'Incorrect table name 'aaaaaa.t_period'' on query. Default database: 'aaaaaa'. Query: 'CREATE TABLE if not exists `aaaaaa.t_period` ( `Fid` bigint NOT NULL AUTO_INCREMENT, `Ftype` int(3) NOT NULL DEFAULT '0', `Fuid` int(11) NOT NULL DEFAULT '0', `Fquest_id` int(11) NOT NULL DEFAULT '0', `Fstep` int(3) NOT NULL DEFAULT '0', `Ffinish_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`Fid`), UNIQUE KEY (`Ftype`, `Fuid`, `Fquest_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8'
Skip_Counter: 0
Exec_Master_Log_Pos: 92449874
执行到这句出错了.Exec_Master_Log_Pos: 92449874
在master上查询 mysql -uroot -e "SHOW BINLOG EVENTS in 'mysql-bin.000014' from 92562567 limit 100;"就这一条命令字节跳过即可.
如果错误events比较多,可以按上面的情况处理.
还可以在my.cnf中设置如下选项自动跳过这种错误.
slave-skip-errors=1062

bitsCN.com
09-08 09:05