[分享]mysql同步GLOBAL sql_slave_skip_counter解释_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1854 | 回复: 0   主题: [分享]mysql同步GLOBAL sql_slave_skip_counter解释        下一篇 
unknsnow
注册用户
等级:上士
经验:272
发帖:78
精华:0
注册:2012-2-10
状态:离线
发送短消息息给unknsnow 加好友    发送短消息息给unknsnow 发消息
发表于: IP:您无权察看 2014-11-13 9:39:59 | [全部帖] [楼主帖] 楼主

大家都知道,当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

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论