mysql主从同步常见异常及恢复方法

2018/07 作者:ihunter 0 0


1. 一般的异常只需要跳过一步即可恢复

>slave stop;

>SET GLOBAL sql_slave_skip_counter = 1;  # 跳过slave上的1个错误

>slave start;

所以在使用set  global sql_slave_skip_counter=1; 时要注意以下几点:
1. 检查跳过的event是否在一个事物中
2. 跳过slave上的event进行后续处理后要检查数据的一致性。
3. 最好能在master的binglog上查看一下跳过的evnet到底做了写什么。


根据slave status中的Relay_Log_FileRelay_Log_Pos两个值 ,先查看当前被中断的binlog event group操作是什么?
查看的命令:
  show relaylog events in "Relay_Log_File" from Relay_Log_Pos limit n;

是由于truncate table db58_user_credit_general时, 表db58_user_credit_general不存在, 所以整个binlog group就这一个语句。
处理的方式以下两种都可以:
 1)可以直接使用set global SQL_SLAVE_SKIP_COUNTER=1跳过此binlog event group

 2) set sql_log_bin=OFF;  create table db58_user_credit_general(id int); set sql_log_bin=ON;


可分析主库日志的事务,来确定SQL_SLAVE_SKIP_COUNTER的合适值。具体步骤如下:

在备库中执行show slave status\G,确认以下两个参数

Relay_Master_Log_File  mysql-bin.000217
Exec_Master_Log_Pos   673146776

根据上述两个参数的值,在主库中查看当前阻碍从库复制的事务以及之后的事务。

mysql> SHOW BINLOG EVENTS in 'mysql-bin.000217' from 673146776;

这个是查看日志文件mysql-bin.000217中事务ID为673146776后的所有事务。

当然,SHOW BINLOG EVENTS的用法还是相当灵活的,下述方式均可。

mysql> SHOW BINLOG EVENTS in 'mysql-bin.000217' from 673146776\G

mysql> SHOW BINLOG EVENTS in 'mysql-bin.000217' from 673146776 limit 10;

也可在主机环境下通过mysqlbinlog命令查看

mysqlbinlog mysql-bin.000217 --start-position=673146776


2.断电导致主从不能同步时,通主库的最后一个bin-log日志进行恢复

在主库服务器上,mysqlbinlog mysql-bin.xxxx > binxxxx.txt

tail -n 100000  binxxxx.txt > tail-binxxxx.txt

vim tail-binxxxx.txt 打开tail-binxxxx.txt文件找到最后一个postion值

然后在从库上,change host to 相应正确的值

>slave stop;

>change master to master_host='ip', master_user='username', master_password='password', master_log_file='mysql-bin.xxxx', master_log_pos=xxxx;

>slave start;

>show slave status\G;


3.主键冲突、表已存在等错误代码如1062,1032,1060等,可以在mysql主配置文件指定

略过此类异常并继续下条sql同步,这样也可以避免很多主从同步的异常中断

[mysqld]

slave-skip-errors = 1062,1032,1060


赞(1) 更多分享

上篇: Yearning SQL审核平台
下篇: mongodb 3.4 集群搭建:分片+副本集