MySQL sql_slave_skip_counter
因为mysql的主从复制是逻辑复制,所以slave在apply relay log的过程中,经常会遇到错误,
而参数sql_slave_skip_counter可以设置跳过多少个event,让slave sql继续。
因为mysql的binlog是由event组成的。一个transaction是一个group,其中包括多个event,
所以sql_slave_skip_counter参数设置的时候需要达到两个效果:
- 既可以跳过多少个event。
- 又保证了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的更多相关文章
- mysql主从之slave-skip-errors和sql_slave_skip_counter
一般来说,为了保险起见,在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=1以跳过命令.但 ...
- mysql小误区关于set global sql_slave_skip_counter=N命令
背景知识1: 在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=N以跳过命令. ...
- 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 ...
- MySQL小误区:关于set global sql_slave_skip_counter=N 命令的一些点
背景知识1: 在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=N以跳过命令.常用 ...
- (转)使用参数SQL_SLAVE_SKIP_COUNTER处理mysql slave同步错误讨论
使用参数SQL_SLAVE_SKIP_COUNTER处理mysql slave同步错误讨论 本文链接地址:http://blog.chinaunix.net/uid-31396856-id-57532 ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- [MySQL Reference Manual] 18 复制
18 复制 18 复制 18.1 复制配置 18.1.1 基于Binary Log的数据库复制配置 18.1.2 配置基于Binary log的复制 18.1.2.1 设置复制master的配置 18 ...
- mysql 主从单库单表同步 binlog-do-db replicate-do-db
方案一:两边做主从. SELECT SUM(DATA_LENGTH)+SUM(INDEX_LENGTH) FROM information_schema.tables WHERE TABLE_SCHE ...
- MySQL主从同步
脚本 [root@test scripts]# cat ss.sh #!/bin/bash . /etc/init.d/functions MYUSER=root MYPASS=c565f972 SO ...
随机推荐
- Struts1运行原理以及整合步骤
Struts1 struts1运行步骤 1.项目初始化:项目启动时加载web.xml,struts1的总控制器ActionServlet是一个Servlet,它在web.xml中是配置成自动启动的S ...
- 11_Servlet生命周期
[生命周期] 以前:之前的java程序,我们的Java类自己去new对象,自已实例化对象去调用. 现在:Servlet程序,Servlet的生命周期由TomCat服务器控制的. 我们要研究Servle ...
- GNU iconv
GNU iconv 一.关键函数 1.iconv_open() iconv_open(DestinationCharsets, SourceCharSets) 2.iconv() [XSI] [Opt ...
- 查找并绘制轮廓[OpenCV 笔记XX]
好久没有更新了,原谅自己放了个假最近又在赶进度,所以...更新的内容是很靠后的第八章,因为最近工作要用就先跳了,后面会更新笔记编号...加油加油! 在二值图像中寻找轮廓 void cv::findCo ...
- OpenJudge 2817:木棒 / Poj 1011 Sticks
1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...
- angular中的orderBy过滤器使用
一 orderBy过滤器 AngularJS中orderBy进行排序,第一个参数可以有三种类型,分别为:function,string,array: 第一种:function,如果是func ...
- ubuntu下编译安装PHP
首先配置configure // ./configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/apache2/bin/apxs --wit ...
- Make和Makefile
无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型 ...
- jQuery 扩展 【ajax实例】
先前写工具类都是自定义类,直接prototype,jQuery扩展这一块儿,一直也没写过,刚好今天有空,写个试试. 已经有很多人对jQuery,jQuery.fn,jQuery.fn.extend详细 ...
- jexus 启动失败 原因定位
现象: root@test:/usr/jexus/siteconf# /usr/jexus/jws restartRestarting ... Failure 定位步骤: 1.查看/usr/jexus ...