通用错误解决方案:
mysql主从复制,经常会遇到错误而导致slave端复制中断,这个时候一般就需要人工干预,跳过错误才能继续 跳过错误有两种方式
- 跳过指定数量的事务
slave stop;
set global sql_slave_skip_counter = 1 #跳过一个事务
slave start
- 跳所有错误或指定类型的错误
修改mysql的配置文件,通过slave_skip_errors参数来跳所有错误或指定类型的错误
slave-skip-errors=1062,1053,1146 #跳过指定error no类型的错误
slave-skip-errors=all #跳过所有错误
1. mysql数据库报1062错误
原因分析:
从库插入数据,发生唯一性冲突。此时从库已经有相同主键的数据,如果再插入相同主键值的数据则会报错。可以查看主库的改行数据与从库的要插入数据是否一致,如一致则跳过错误,恢复SQL线程,如不一致,则以主库为准,将从库的该行记录删除,再开启复制。
例如:
问题由来:
经查看是主键冲突的问题,导致在写入数据的时候造成冲突。从库插入数据,发生唯一性冲突。
此时从库已经有相同主键的数据,如果再插入相同主键值的数据则会报错。可以查看主库的改行数据与从库的要插入数据是否一致,如一致则跳过错误,恢复SQL线程,如不一致,则以主库为准,将从库的该行记录删除,再开启复制。
解决办法:
mysql 主键冲突解决办法(1062错误)
stop slave;
set global slave_exec_mode=idempotent;
start slave;
两台服务器都要做。
配置文件:
slave_exec_mode=IDEMPOTENT
具体参数:https://dev.mysql.com/doc/refman/5.7/en/replication-options-slave.html#sysvar_slave_exec_mode
2. 数据库报 1032 错误解决办法
原因分析:
删除或更新从库的数据,从库找不到记录。此时,主库的数据是比从库新的,可以采取从库添加相同的数据在开启复制恢复SQL线程。
1032错误码说明:
MySQL主从同步的1032错误,一般是指要更改的数据不存在,SQL_THREAD提取的日志无法应用故报错,造成同步失败
(Update、Delete、Insert一条已经delete的数据)。
1032的错误本身对数据一致性没什么影响,影响最大的是造成了同步失败、同步停止。
如果主主(主从)有同步失败,要第一时间查看并着手解决。因为不同步,会造成读取数据的不一致。应在第一时间恢复同步,
尽量减少对业务的影响。然后再具体分析不同步的原因,手动或者自动修复数据,并做pt-table-checksum数据一致性检查。
如图:
可以在主上查看
mysqlbinlog --no-defaults -v --base64-output=decode-rows --stop-position=14631 mysql-bin.000018 | tail -20
以上为检索出来的结果,事务语句为:delete from db_99ducj.tbuservcbgolog where @1=10561502 and @2=1683955 …
其中@1 @2 @3…分别对应表的列名,填补上即可。
我们可以逆向此SQL 将deleter 变成Insert,手动在从库上执行此Insert SQL,之后restart slave就好了。
逆向SQL update、delete 就变成insert
实际问题:
现象: 报错信息