技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> MySQL --> sql_slave_skip_counter参数

sql_slave_skip_counter参数

浏览:1791次  出处信息

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. mysql 主从配置中的server-id的作用    (阅读:6615)
  2. 内存表在同步环境注意事项    (阅读:4705)
  3. 也谈PostgreSQL的同步配置(Slony)    (阅读:4660)
  4. MySQL5.5数据库复制搭建报错之Could not initialize master info structure    (阅读:4384)
  5. PHP查询MySQL大量数据的内存占用分析    (阅读:3919)
  6. MTU值的调整导致MySQL复制异常    (阅读:3643)
  7. MySQL复制的概述、安装、故障、技巧、工具    (阅读:3266)
  8. 自己动手实现Multi-Master Replication    (阅读:3100)
  9. mysql主从热备配置(含innodb)终极版    (阅读:2972)
  10. mysql主从同步快速设置    (阅读:2943)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1