主从同步,常见故障!
1、在master上删除一条记录,在slave上找不到。
Last_SQL_Error.Could not execute Delete_rows event on table ….Error_code:1032……
2、主键冲突,在slave已经有该记录, 又在master上插入了同一条记录
Last_SQL_Error.Could not execute Write_rows event on table…… Error_Code :1062……
3、在master上更新一条记录,在slave上找不到数据
Last_SQL_Error.Could not execute Update_rows event …… Error_Code: 1032……
以上三种情况在HA切换过程中,由于异步复制且sync_binlog=0 时,会造成小部分binlog 没接受完而导致报错。
4、slave中继日志损坏
Last_SQL_Error:Error initializing relay log postion: I/O error reading the header from the binary log
Last_SQL_Error:Error initializing relay log positon:Binlog has bad magic number:it’s not a binary log file that can be used by this version of MySQL.
Slave 宕机或非法关机,电源故障、硬件故障,造成中继日志损坏。
解决方法:
对于第一种情况: master要删除一条记录,而slave上找不到相应记录而报错。Master上已经删除,slave 并没有改记录,可以直接跳过:
Stop slave ; set global sql_slave_skip_counter=1;start slave;
对于监控的情况: 出现情况报警,如何控制呢? 调用脚本?
对于第二种情况的处理:对于重复的记录,需要删除重复的键值。!
第三种情况: master更新的记录,在slave上找不到。通过 Mysqlbinlog 分析出真实的语句,将slave缺少的记录进行手动填充。!
第四种:找到salve 同步执行到master的位置。重新做同步。
查找变量:
Relay_Master_Log_File:
Exec_Master_Log_Pos:
从这两个位置重新同步。
如果业务允许的话,可以设置下面两个变量:
slave-skip-errors=1022,1032,1062 (必须在 my.cnf中进行设置,只读的系统变量)
(1022 :Message: Can't write; duplicate key in table '%s')
(1032: Message: Can't find record in '%s')
(1062: Message: Duplicate entry '%s' for key %d)
slave_exec_mode (可在全部变量中进行设置)
可选项为STRICT(默认)和IDEMPOTENT 模式, STRICT遇到任何问题,都会导致复制的停止。
IDEMPOTENT 对于 duplicate key 和 no-key-found错误跳过。
注:以上两个参数的设置,如果出现跳过的情况,则会在错误日志中进行记录。(如何把出现问题的时候 出现的监控中呢? 问题一!)
错误我们可以解决,那主从数据的一致性我们该如何验证呢?可以参考这边文章:
http://weipengfei.blog.51cto.com/1511707/976545
在出现主从数据不一致的情况,如何修复呢?
本文出自 “技术成就梦想” 博客,请务必保留此出处http://weipengfei.blog.51cto.com/1511707/1068258
查看本栏目更多精彩内容:http://www.bianceng.cn/database/basis/