sql_slave_skip_counter参数
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条记录,那么结果又是什么呢?:)
建议继续学习:
- mysql 主从配置中的server-id的作用 (阅读:6549)
- 也谈PostgreSQL的同步配置(Slony) (阅读:4593)
- 内存表在同步环境注意事项 (阅读:4584)
- MySQL5.5数据库复制搭建报错之Could not initialize master info structure (阅读:4261)
- PHP查询MySQL大量数据的内存占用分析 (阅读:3841)
- MTU值的调整导致MySQL复制异常 (阅读:3533)
- MySQL复制的概述、安装、故障、技巧、工具 (阅读:3197)
- 自己动手实现Multi-Master Replication (阅读:2968)
- mysql主从热备配置(含innodb)终极版 (阅读:2898)
- mysql主从同步快速设置 (阅读:2875)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:zhang 来源: SQL部落
- 标签: sql_slave_skip_c 主从同步
- 发布时间:2011-05-25 12:31:13
- [65] Oracle MTS模式下 进程地址与会话信
- [64] Go Reflect 性能
- [64] 如何拿下简短的域名
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [58] 【社会化设计】自我(self)部分――欢迎区
- [58] 图书馆的世界纪录
- [56] android 开发入门
- [53] 视觉调整-设计师 vs. 逻辑
- [46] 读书笔记-壹百度:百度十年千倍的29条法则
- [45] 界面设计速成