跳还是不跳?这是个问题

周一(2014-11-17)有个项目进行变更,而且是重大变更,DB测操作从早上持续到下午17点,QA同事到晚上10点测试后发现,slave上的数据与master上不一致。
忘介绍了,该项目的该模块有读请求以及delete逻辑在上面,被吓到没?

这个问题应该在情理之中但又在意料之外,其实DBA在下午DB变更时便遇到slave卡住:

Could not execute Delete_rows event on table codcpc_1004pc_0x3EC.mail; Can‘t find record in ‘mail
‘, Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event‘s master log binlog.010464, end_log_pos 82113, Error_code: 1032
141117  7:54:31 [Warning] Slave: Can‘t find record in ‘mail‘ Error_code: 1032

我当时的做法是直接跳过不存在的表,写了下面这个脚本:

mysqlconn="mysql -uADMIN -p4word"

#while [ "1" = "1" ]

for i in `seq 1 30`
do
   status=`$mysqlconn -e "show slave status\G;" | grep -i "Last_SQL_Error" | grep -i "mail"`
   if [ -n "$status" ];then
   $mysqlconn -vvve "stop slave;set global sql_slave_skip_counter=1;start slave;"
   sleep 1
   else
     $mysqlconn -vvve "show slave status\G"
     echo "error is OK!"
     exit 0
   fi
done

很奇怪的,本以为得写死循环跑,没想到在调试 3次以内就过了,当时没有深究,也因为没时间深究导致后面的熬夜排查问题。

始作俑者是一条SQL:delete from mail where recipientEntityID in (select userid from test.deltb);

今天出现卡住,主要还是因为Delete_rows发现键不存在,如果改为statement,这个问题就不会出现。因为那条罪魁祸首的sql,在slave上肯定能执行下去。
可关键是我们的binlog_format是MIXED模式,那么问题来了,在什么情况下,binlog_format=mixed时,生成的binlog会转换为row格式?关于这点我查了官方文档,看得不是很明白,留待之后更新。

而binlog_format是row模式的时候,skip是以事务级别来的。 
下午的删除里边,在master上做的delete,实际上binlog会转换为很多binlog event,而这些event仅仅被几个begin commit包围着。
这也就解释了上面我的问题。

那么跳还是不跳?sql_slave_skip_counter=N在线上跳确实存在一定风险。

⑴ InnoDB时,N=1是跳过整个事务,而不只是一条SQL语句
⑵ 当RBR模式时,无论是InnoDB 或MyISAM,binlog event都是以begin;row group;commit来组织,当N=1时跳过的还是整个事务内容

更安全的做法是sql_exec_mode=IDEMPOTENT,只跳过有问题的SQL或者row,相对于sql_slave_skip_counter而言,slave_exec_mode的处理范围更小、更安全,不过其仅仅适合RBR模式 :(

时间: 2024-08-25 19:29:03

跳还是不跳?这是个问题的相关文章

iOS中的视图跳转的三种方式(代码跳转,根据桥跳转,按钮跳转)

#import "ViewController.h" #import "SecondViewController.h" @interface ViewController () @property (retain, nonatomic) IBOutlet UITextField *textField; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // D

自制通过html网页自动跳转代码跳转页面

建设网站时,我们经常会遇到需要跳转页面的情况,例如我们的网站分中英文版本,网站程序索引页不是直接放在根目录下,而是分别放在"en"和"cn"目录中区分中英版本,打开网站时,想直接跳转到en目录访问英文版,则需要使用跳转代码跳转后方可以访问.下面我们看一下如何通过html代码跳转页面. <!DOCTYPE html> <html lang="en"> <head> <meta charset="U

【剑指Offer】跳台阶&amp;变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 当n = 1时,有一种跳法.f(1) = 1 当n = 2时,有两种跳法,跳两次,一次跳一级.跳一次,直接跳两级. f(2) = 2 当n > 2时,第一次跳一级,这时跳法数目就等于后面n - 1级的跳法数目,第一次跳两级,这时跳法数目就等于后面n - 2级的跳法数目.因此f(n) = f(n-1) + f(n-2).结果为斐波那契数列. 解法一.递归 (时间复杂度随

增加一个类似于成功跳转和错误跳转的跳转

第一步,找到成功跳转函数定义的地方,增加info()函数 第二,找到dispatchJump(),修改成 第三步:找到convention.php配置文件,增加一条配置模板 第四.调用 注意:模板文件要使用图片要用绝对路径.第二步判断是否等于1,不可省略,因为非0就是true

网页自动跳转/定时跳转/重定向功能的设置

在一些情况下,我们会希望自己的某条链接打开之后自动跳转到另一个页面去,比如: 情景1:原有链接所指网站停用,访问用户被重定向到其他替代网页: 情景2:设置欢迎页,订单提交成功页等信息展示页面,延时跳转到接下来的逻辑页面: 情景3:希望发送自己域名的地址显示他人的页面: 情景4:用于页面的定时刷新: 等等 HTML在head中的mate标签提供了自动跳转的方式,设置非常简单 <meta http-equiv="refresh" content="延时时间(s);url=h

记一次301跳转--不跳转内页问题

客户设置了301跳转,可只有首页跳转成功,内页不跳转,后来核查,客户有设置伪静态规则,需要把伪静态规则放在301跳转规则后面即可正常实现内页跳转功能. <?xml version="1.0" encoding="UTF-8"?> <configuration> <location path="" overrideMode="Deny"> </location> <locat

[javascript]各种页面定时跳转(倒计时跳转)代码总结

(1)使用setTimeout函数实现定时跳转(如下代码要写在body区域内) 1 <script type="text/javascript"> 2 //3秒钟之后跳转到指定的页面 3 setTimeout(window.location.href='http://www.baidu.com',3); 4 </script> (2)html代码实现,在页面的head区域块内加上如下代码 1 <!--5秒钟后跳转到指定的页面--> 2 <met

[剑指OFFER] 斐波那契数列- 跳台阶 变态跳台阶 矩形覆盖

跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloor(int number) { if(number == 1) return 1; if(number == 2) return 2; int n1 = 1; int n2 = 2; int rtn = 0; for(int i = 3; i <= number; i++) { rtn = n1 + n2; n1 = n2;

a标签href不跳转 禁止跳转

当页面中a标签不需要任何跳转时,从原理上来讲,可分如下两种方法: 标签属性href,使其指向空或不返回任何内容.如: <a href="javascript:void(0);" >点此无反应javascript:void(0)</a> <a href="javascript:;" >点此无反应javascript:</a> 标签事件onclick,阻止其默认行为.如: <a href="" o