IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

sql_slave_skip_counter参数

SQL部落 2011-05-25 12:31:13 累计浏览 2,386 次
本机暂存

sql_slave_skip_counter这个全局参数,维护过主从架构的DBA一定都不陌生,当从库的sql_thread被意外中断,你又想尽快恢复主从间的正常复制,就会用到这个参数;这个跳过的后果就是,你的业务要能容忍这个跳过所带来的丢失,也就是主库和从库上的数据将会不再一致,尽管之后你的主从同步又正常,其实严格意义上,这个从库已经没有意义了,无论是去备份还是对外提供读的服务,也就是说“她”已经不在纯净。那么,这个参数具体是什么含义呢?我相信有些同学一定知道它的真确含义,而有些人自以为知道它的含义,但其实是一个错误的概念(腾讯内部的MySQL培训讲师即便如此,那么,我想你懂得),所以,我觉得还是有必要作为一个Blog写出来,为了自己的巩固,也帮大家理解。

在MySQL的官方手册有对它的有一些轻描淡写的解释,一个小节不是很多,如果,你看过之后不去具体实践一下,自认为明白了,那么,往往你会被自己骗了。说实话,之前我也理解错了,以为skip counter这个值是我们具体执行的一条一条的SQL语句,也就是今天早上需要调整一个主从结构,我就顺带的测试了一下,在和田老师不断交流后,才明白了它的正确含义。这里有两个关键的地方,第一:EVENT也就是事件,通过命令show binlog events in ‘mysql-bin.xxxxxx’;你看到的每一行输出,这就是一个事件;第二:事务,大家耳熟能详的术语,一系列有序SQL语句的集合,可能就只有一条也可能有N条,这语句要么全部执行提交要么全部回滚保持不变,在binlog里面以Begin开始,Commit结束的这么一个group。

set global sql_slave_skip_counter = N;  这个N就是事件的个数,这个参数的含义就是,告诉从库的sql线程跳过多少个relog-log里面的事件数。通过上面提高到show binlog events这个命令,你会发现,create这样的语句被记成一个事件,Insert/Update这类的语句,因为事务与非事务引擎的差异,而有所不同,对事务型表的修改,则由3个事件组成,Begin开始,具体 SQL语句,最后 Commit结束;非事务型表就是你所执行的那条SQL语句。下面简要举例说明下:

- Case 1 -

主库:

mysql> insert into myisam_tb values (1);

mysql> insert into myisam_tb values(2);

mysql> show binlog events;

use test;  insert into myisam_tb values (1)

use test;  insert into myisam_tb values (2)

从库:

mysql> stop slave;

mysql> set global sql_slave_skip_counter = 1;

mysql> start slave;

mysql> select * from test.myisam_tb;

结果,你会发现从库只有2这条记录;实际上,对于myisam这样的非事务型引擎一个事件也就是对应一条SQL语句,所以,这时N的值就是跳过SQL语句的条数。

- Case 2 -

主库:

mysql> insert into innodb_tb values (1);

mysql> insert into innodb_tb values(2);

mysql> show binlog events;

BEGIN

use test;  insert into innodb_tb values (1)

COMMIT

BEGIN

use test;  insert into innodb_tb values (2)

COMMIT

从库:

mysql> stop slave;

mysql> set global sql_slave_skip_counter = 1;

mysql> start slave;

mysql> select * from test。innodb_tb;

结果,你会发现从库中也只有2这一条记录;这里设置的是1,让slave端跳过一个事件,也就是跳过第一条SQL语句的前面的BEGIN不执行,根据前面说的事务的特性,一个事务里面的语句要么都做,要不都不做,所以,第一条插入的语句就被跳过了,只剩下第二条insert语句被成功执行。事实上,参数设置为1、2、3,最后同步到从库上的记录数都是相同的。

看到这里,我想大家一定都明白了sql_slave_skip_counter这个参数的真确含义。那么,是否真的明白了呢,就来考考你啦,如果N=4,上面的结果是什么呢;如果N=11,我又想innodb类型的表中insert了3条记录,那么结果又是什么呢?:)

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,253)
  2. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,401)
  3. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  4. Mysql监控指南 (累计阅读 21,352)
  5. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,523)
  6. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 13,058)
  7. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  8. 浅谈MySQL索引背后的数据结构及算法 (累计阅读 11,910)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,709)
  10. 深入浅出INNODB MVCC机制与原理 (累计阅读 9,693)