最新消息:

sql_slave_skip_counter参数

mysql admin 4644浏览 0评论

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 […]

转载请注明:爱开源 » sql_slave_skip_counter参数

您必须 登录 才能发表评论!