案例分析:从库复制出错

wKioL1UakjySTdkyAAICN3C2rmw941.jpg

mysql sql_salve_skip_counter_第1张图片

1.    从错误日志和slave status来看,复制在relay_master_log_file=mysql-bin.000088这个日志文件的exec_master_log_pos=471880483这个position上出错了!

2.    因为show binlog events 这个命令不能针对relay_bin中继日志做读取event,所以我们还得回到主库上去读mysql-bin二进制日志文件。

3.    去主库执行show binlog events in 'mysql-bin.000088' from 471880483 limit 10;

mysql sql_salve_skip_counter_第2张图片


可以看出从471880483 到471880982这个出问题的insert 语句,一共分成了三个event!(可以看出一个事务并非就是一个event,而会是三个event!begin/insert/commit)

4.    执行set global sql_salve_skip_counter=1!  此句表示从此刻的位置跳过1个event!

    另外在别的资料里还看到有两个策略:

    1、若N=1且当前event为BEGIN, 则N不变,跳过当前event继续。

    2、若N=1且当前event处于一个事务之内(BEGIN之后,COMMIT之前),则N不变,跳过当前event继续。

     说明:其实上面两个策略合起来就是一句话,当N=1时,会连续跳过若干个event,直到当前所在的事务结束。

    当然如果N>1,则跳过N个event!并且最后不能处于一个事务内!


5.    执行set global sql_salve_skip_counter=1! ,再去看错误日志

wKioL1UamK2wOd0EAAPrZlSfxO0233.jpg

可以看出mysql从event=1 跳过了 第二个和第三个event,从第四个event新的pos=471880982 重新开始执行中继日志!