常见的主从报错集锦
MySQL主从同步报错故障处理集锦
在发生故障切换后,经常遇到的问题就是同步报错,下面列举了几种比较常见的情况以及处理方法、
1.1032记录删除失败
解决方法
Master要删除一条记录,而slave上找不到报错,这种情况主都已经删除了,那么从都可以直接跳过
2.1032更新丢失
解决方法
在Master上,用Binlog日志分析下出错的Binlog日志在干什么。
由于线上的数据都是row格式,用mysqlbinlog解析出来后用binlog2sql工具解析出具体的sql
在Slave上,查找下更新后的那条记录,应该是不存在的。
mysql> select * from t1 where id=2;
Empty set (0.00 sec)
然后再到Master上查看
mysql> select * from t1 where id=2;
+----+------+
| id | name |
+----+------+
| 2 | cjl |
+----+------+
1 row in set (0.00 sec)
把丢失的数据在Slave上填补,然后跳过报错即可。
mysql> insert into t1 values (2,'cjl');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1 where id=2;
+----+------+
| id | name |
+----+------+
| 2 | cjl |
+----+------+
1 row in set (0.00 sec)
mysql> stop slave ;set global sql_slave_skip_counter=1;start slave;
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
……
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
……
3.1062主键重复
解决方法
在slave上用desc hcy.t1;看下的表结构:
mysql> desc hcy.t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | PRI | 0 | |
| name | char(4) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
查看从库ID=2的数据是否跟主库ID=2的数据是否一致。
如果一致,则跳过
如果不一致,则在从库上删除重复的主键
mysql> delete from t1 where id=2;
Query OK, 1 row affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
……
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
……
mysql> select * from t1 where id=2;
4.1236错误,binlog缺失
解决方法
首先停止从库同步
查看主库日志文件和位置
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000013 | 154 |
+------------------+-----------+
回从库,使日志文件和位置对应主库
最后,启动从库
start slave;
show slave status\G
Master_Log_File: mysql-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Error:
5.1236错误主库重启
解决方法
登录到Master主机,执行命令查看对应的报错日志跟最后的位置
[root@mysqlmaster2 mysql]# mysqlbinlog --no-defaults mysql-bin.001359 >> /tmp/123.log
[root@mysqlmaster2 mysql]# vi /tmp/123.log
[root@mysqlmaster2 mysql]# tail -f /tmp/123.log
insert into tb_o2n2 (device_o2_id,type,value,rectime)values(1,"N2",0,"2018-11-05 00:15:31.550817")
/*!*/;
# at 61918946
#181105 0:15:36 server id 2 end_log_pos 61918977 CRC32 0xc9906a5c Xid = 157867719
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
在Slave上去执行
->stop slave;
->···
-> MASTER_LOG_FILE="mysql-bin.001359",
-> MASTER_LOG_POS=61918977
->···
->start slave;
6.1593中继日志损坏
解决方法
找到同步的binlog和POS点,然后重新做同步,这样就可以有新的中继日志生成了。
···
Relay_Master_Log_File: mysql-bin.000010
Exec_Master_Log_Pos: 821
···
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=821;
Query OK, 0 rows affected (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)