IT技术博客大学习 共学习 共进步

sql_slave_skip_counter参数

SQL部落 2011-05-25 12:31:13 浏览 2,323 次

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的作用 (阅读 7,663)
  2. 内存表在同步环境注意事项 (阅读 5,585)
  3. 也谈PostgreSQL的同步配置(Slony) (阅读 5,407)
  4. MySQL5.5数据库复制搭建报错之Could not initialize master info structure (阅读 5,284)
  5. PHP查询MySQL大量数据的内存占用分析 (阅读 4,924)
  6. MTU值的调整导致MySQL复制异常 (阅读 4,663)
  7. MySQL复制的概述、安装、故障、技巧、工具 (阅读 4,264)
  8. mysql主从同步快速设置 (阅读 3,842)
  9. [MySQL优化案例] — slave延迟很大优化方法 (阅读 3,845)
  10. 如何监控主从之间的延时:seconds_behind_master OR mk-heartbeat (阅读 3,824)