mysql主从复制--从库跳过错误日志点
(本文转载,特此声明)
在mysql进行replication的时候,有时候会由于主从端的pos点不同,导致复制的sql进程出现错误,从而导致主从复制失败。比如在主端复制一个id是100的到从端,而此时由于某种原因从端已经有了id=100的记录,这时进行insert操作的时候,就会主键重复,插入失败。这时候需要跳过这条错误。方法如下
1:停止slave 服务
mysql> stop slave;
2:设置跳过的event个数
mysql> set global sql_slave_skip_counter = 1;
3:启动slave服务
mysql> start slave;
下面阐述下n的意思,转帖
大家都知道,当slave出现错误时,可以通过set global sql_slave_skip_counter = n来跳过错误,但是这个n,又真正代表什么呢,开始时,
理解错了,以为对于事务型,n代表n个事务,而非事务型,代表一条sql 语句。后经过linuxtone曹哥指导发现,其实并不是这么回事
文档中有介绍说(http://dev.mysql.com/doc/refman/ ... e-skip-counter.html):
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 |
| 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')这里了。
