Mysql同步复制报错故障处理

  • 先听大哥给你讲讲异步复制和同步复制的区别:
异步复制:master将binlog发送给slave,不管slave是否接受完毕,也不管是否执行完,这一动作就结束。
半同步复制:master把binlog发送过去,slave确认接受完,但不管它是否执行完,slave会给master 一个信号我这边收到了,动作结束。。
  • ERROR处理:
 1 问题:在master上删除一条记录后,slave上找不到记录导致报错
#解决方法:因主机master已经删除了改记录,可采取从机直接跳过的方式解决 命令如下:stop slave;set global sql_slave_skip_counter=1;start slave
2 问题:主键重复
#解决方法:在slave上执行-> desc 表 -> 得到主键的字段名 -> delete掉重复主键 -> 开启同步功能 start salve;
3 问题:在master 上更新一条记录,slave上找不到
#解决方法: 在master 查到该数据 在slave上进行填补(啊哈哈)然后执行跳过报错 命令如下:stop slave;set global sql_slave_skip_counter=1;start slave
4 问题:slave的中继日志relay-log损坏
#解决方法: 找到同步binglog日志和POS点,然后重新进行同步,这样就可以有新的中继日志了。操作如下 stop slave; -> CHANGE master TO master_LOF_FILE=’MySQL-bin.xxxxxx’,master_LOG_POS=xxx; -> start slave;(完美)
5 问题:在Mysql master上使用binlog_ignore_db命令忽略一个库以后,使用mysql –e执行的所有语句就不写binlog了。结果行创建的表在slave上一个都没有,原因就是没有使用 use 库名
先来了解下忽略某个库的复制参数(两个参数):
一个是binlog_ignore_db(是在主上设置,列如,binlog_ignore_db=test,这时对test库的所有操作都不会记录下来),
另一个是replicate-ignore-db(是在从库上设置,列如,replicate-ignore-db=test,这时对test库下的所有操作都不会被SQL线程执行)
#解决方法:所以最好在从库上执行replicate-ignore-db
  • 方法:
1, slave_exec_mode 参数可自动处理同步复制错误,方法如下:
动态设置参数如下 set global slave_exec_mode=’IDEMPOTENT’(默认值是STRICT(严格模式)),
设置后需要关闭同步后在开启同步。
设置完毕后,但出现1023错误(记录没有找到)和1062(主键重复)时,就会自动跳过该错误,并记录到错误日志里
2, 如何验证主从数据一致,方法如下:
使用Maatkit开源工具,其中mk-table-checksum是用来检测master和slave上的表结构数据是否一致的。而mk-table-sync则是在主从数据不一致时,用来修复的。
3, 恢复slave 上的某几张表,方法如下
也可以直接导出一个库(前提你要考虑下你库的数据量大小),恢复表的方法如下:
在主库到处要恢复的表 列:stop slave; -> mysqldump –uroot –p123456 –q –single-transaction –master-data=2 testdb t1 t2 3 >./t1_t2_t3.sql  -> 查看t1_t2_t3.sql文件,找出记录binlog和POS点:
 使用more查看:more t1_t2_t3.sql ,列如如下信息: master_LOG_FILE=’MySQL-bin.001111’
master_LOG_POS=11111111;  -> 把t1_t2_t3.sql 复制到slave机器上,并做change master to 指向:start slave until master_LOG_FILE=’MySQL-bin.001111’,master_LOG_POS=11111111; 直到sql_thread线程为NO,这期间的同步报错一律都可跳过,命令如:stop slave;set global sql_slave_skip_counter=1;start slave  ->  在slave上导入 t1_t2_t3.sql mysql –u root –p123456 < ./ t1_t2_t3.sql 成功后开启同步。
4, 清楚slave同步信息(比如下线一台slave),方法如下:
就一条命令 reset slave all;(完美)