12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
ADADADADAD
mysql数据库 时间:2024-12-25 09:58:24
作者:文/会员上传
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
跳过复制错误mysql因为binlog机制问题,有些时候会出现从库重放sql执行失败的情况,特别是旧的STATEMENT模式最容易出现这种情况(因为函数和存储过程等原因),这也是为什么强调使用m
以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。
跳过复制错误
mysql因为binlog机制问题,有些时候会出现从库重放sql执行失败的情况,特别是旧的STATEMENT模式最容易出现这种情况(因为函数和存储过程等原因),这也是为什么强调使用mixed和row模式的原因。另外就是一些外部XA事务,因为XA事务日志不在mysql中,有时候会出现回滚失败的情况,导致主从报错。
出现这些状况那该怎么办好呢?如果是重做,虽然是可以,但是如果库非常大,那耗时就不是一两小时那么容易,如果是做了生产读写分离的,就不好交代了。这个时候我们可以选择手动修改数据,然后跳过这个复制错误,然后这个主从复制就会重新运行了。
继续讲述两种模式,先说的是GTID模式,他可以有两种方式跳过。第一种是用得比较多的,注入空事务跳过:
#找到冲突的GTID号.mysql>showslavestatus\G。。。Executed_Gtid_Set:09cb91bf-2669-11e7-8b70-00163e0835ff:1-83648451。。。#停止复制mysql>stopslave;#然后执行设置一个事务GTID来跳过,因为我们就是卡在这里,所以要跳过83648451这个事务的意思mysql>SETgtid_next='09cb91bf-2669-11e7-8b70-00163e0835ff:83648451';#注入空事务mysql>BEGIN;COMMIT;#把GTID设置回自动模式mysql>SETgtid_next='AUTOMATIC';#重新开启复制mysql>STARTSLAVE;#这就可以跳过一个事务了,原理在于通过执行一个空事务代替master传递过来的冲突事务.#当然跳过了,并不代表这个数据就不修改了,还是要你手动去修改一下,这样就一切回归正常了mysql>updatetablesset。。。。。。。
第二种,直接跳过这个GTID,改做后面的
#找到冲突的GTID号.mysql>showslavestatus\G。。。Executed_Gtid_Set:09cb91bf-2669-11e7-8b70-00163e0835ff:1-83648451。。。#停止复制mysql>stopslave;#直接设置上面的GTID值+1mysql>SET@@GLOBAL.GTID_PURGED='09cb91bf-2669-11e7-8b70-00163e0835ff:1-83648452';#重新开启复制mysql>STARTSLAVE;#当然跳过了,并不代表这个数据就不修改了,还是要你手动去修改一下,这样就一切回归正常了mysql>updatetablesset。。。。。。。
然后就说传统模式了,相对来说,更简单一些
#停止复制mysql>slavestop;#设定跳过一个事务mysql>SETGLOBALSQL_SLAVE_SKIP_COUNTER=1#重新开启复制mysql>slavestart#这样就正常了,但是,当然还是要把数据修改上去mysql>updatetablesset。。。。。。。
其实还有一个禁忌设定方式,可以跳过一些复制报错,因为不建议,只是拿出来说说可以这么干
#修改配置文件vim/etc/my.cnf[mysqld]#跳过指定errorno类型的错误#slave-skip-errors=1062,1053,1146#跳过所有错误#slave-skip-errors=all
11-20
11-19
11-20
11-20
11-20
11-19
11-20
11-20
11-19
11-20
11-19
11-19
11-19
11-19
11-19
11-19