因为mysql的主从复制是逻辑复制,所以slave在apply relay log的过程中,经常会遇到错误,
而参数sql_slave_skip_counter可以设置跳过多少个event,让slave sql继续。

因为mysql的binlog是由event组成的。一个transaction是一个group,其中包括多个event,

所以sql_slave_skip_counter参数设置的时候需要达到两个效果:

  1. 既可以跳过多少个event。
  2. 又保证了group的原子性,即如果一个group中的一个event跳过,那么整个group也skip。

下面就来看下MySQL中的源码是如何处理的:

  1. 相关数据结构:

enum enum_skip_reason {
/**Don't skip event.*/
EVENT_SKIP_NOT,
/**
Skip event by ignoring it.
This means that the slave skip counter will not be changed.
*/
EVENT_SKIP_IGNORE,
/**
Skip event and decrease skip counter.
*/
EVENT_SKIP_COUNT
};

  apply_event的过程中,是否需要skip,以及是否递减sql_slave_skip_counter都是依据这个枚举变量。

2. 测试case:

  master: insert into test(2, 'xxx'); commit

  

2.1. binlog格式

根据row格式,上面的sql产生如下的binlog,一个包括4个event。

begin:
table_map:
write_row:
xid:

2.2. 设置slave

因为主键冲突,slave停止恢复

case 1: set global sql_slave_skip_counter=1; start slave
case 2: set global sql_slave_skip_counter=10; start slave

2.3. 关键函数:

下面四个函数对应着4个event是否skip,以及如何skip。

1. query_log::do_shall_skip()
2. table_map::do_shall_skip()
3. write_row::do_shall_skip()
4. xid::do_shall_skip()

但这里有一个非常关键的处理判断:

  Log_event::continue_group(Relay_log_info *rli)
{
if (rli->slave_skip_counter == )
return Log_event::EVENT_SKIP_IGNORE;
return Log_event::do_shall_skip(rli);
} Log_event::do_shall_skip(Relay_log_info *rli)
rli->slave_skip_counter == && rli->is_in_group())
return EVENT_SKIP_IGNORE;
else if (rli->slave_skip_counter > )
return EVENT_SKIP_COUNT;
else
return EVENT_SKIP_NOT;

其整体的逻辑如下:

1. 如果slave_skip_counter =1 ,那么一直skip,直到遇到xid,然后递减成0.
2. 如果slave_skip_counter =10, 每一个event都skip,并且递减counter,直到xid结束,递减成6.

3. 结论:

所以, slave_skip_counter包含了两层意思:

1. 跳过多少个event
2. 保证一个group的完整性

MySQL sql_slave_skip_counter的更多相关文章

  1. mysql主从之slave-skip-errors和sql_slave_skip_counter

    一般来说,为了保险起见,在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=1以跳过命令.但 ...

  2. mysql小误区关于set global sql_slave_skip_counter=N命令

      背景知识1:     在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=N以跳过命令. ...

  3. Another reason why SQL_SLAVE_SKIP_COUNTER is bad in MySQL

    It is everywhere in the world of MySQL that if your replication is broken because an event caused a ...

  4. MySQL小误区:关于set global sql_slave_skip_counter=N 命令的一些点

    背景知识1:     在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=N以跳过命令.常用 ...

  5. (转)使用参数SQL_SLAVE_SKIP_COUNTER处理mysql slave同步错误讨论

    使用参数SQL_SLAVE_SKIP_COUNTER处理mysql slave同步错误讨论 本文链接地址:http://blog.chinaunix.net/uid-31396856-id-57532 ...

  6. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  7. [MySQL Reference Manual] 18 复制

    18 复制 18 复制 18.1 复制配置 18.1.1 基于Binary Log的数据库复制配置 18.1.2 配置基于Binary log的复制 18.1.2.1 设置复制master的配置 18 ...

  8. mysql 主从单库单表同步 binlog-do-db replicate-do-db

    方案一:两边做主从. SELECT SUM(DATA_LENGTH)+SUM(INDEX_LENGTH) FROM information_schema.tables WHERE TABLE_SCHE ...

  9. MySQL主从同步

    脚本 [root@test scripts]# cat ss.sh #!/bin/bash . /etc/init.d/functions MYUSER=root MYPASS=c565f972 SO ...

随机推荐

  1. Struts1运行原理以及整合步骤

    Struts1  struts1运行步骤 1.项目初始化:项目启动时加载web.xml,struts1的总控制器ActionServlet是一个Servlet,它在web.xml中是配置成自动启动的S ...

  2. 11_Servlet生命周期

    [生命周期] 以前:之前的java程序,我们的Java类自己去new对象,自已实例化对象去调用. 现在:Servlet程序,Servlet的生命周期由TomCat服务器控制的. 我们要研究Servle ...

  3. GNU iconv

    GNU iconv 一.关键函数 1.iconv_open() iconv_open(DestinationCharsets, SourceCharSets) 2.iconv() [XSI] [Opt ...

  4. 查找并绘制轮廓[OpenCV 笔记XX]

    好久没有更新了,原谅自己放了个假最近又在赶进度,所以...更新的内容是很靠后的第八章,因为最近工作要用就先跳了,后面会更新笔记编号...加油加油! 在二值图像中寻找轮廓 void cv::findCo ...

  5. OpenJudge 2817:木棒 / Poj 1011 Sticks

    1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...

  6. angular中的orderBy过滤器使用

    一  orderBy过滤器   AngularJS中orderBy进行排序,第一个参数可以有三种类型,分别为:function,string,array:   第一种:function,如果是func ...

  7. ubuntu下编译安装PHP

    首先配置configure // ./configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/apache2/bin/apxs --wit ...

  8. Make和Makefile

    无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型 ...

  9. jQuery 扩展 【ajax实例】

    先前写工具类都是自定义类,直接prototype,jQuery扩展这一块儿,一直也没写过,刚好今天有空,写个试试. 已经有很多人对jQuery,jQuery.fn,jQuery.fn.extend详细 ...

  10. jexus 启动失败 原因定位

    现象: root@test:/usr/jexus/siteconf# /usr/jexus/jws restartRestarting ... Failure 定位步骤: 1.查看/usr/jexus ...