MySQL主从同步报错故障处理记录

前言

在发生故障切换后,经常遇到的问题就是同步报错,下面是最近收集的报错信息。


记录删除失败

在master上删除一条记录,而slave上找不到

Last_SQL_Error: Could not execute Delete_rows event on table hcy.t1;
Can‘t find record in ‘t1‘,
Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND;
the event‘s master log mysql-bin.000006, end_log_pos 254

解决方法:master要删除一条记录,而slave上找不到报错,这种情况主都已经删除了,那么从机可以直接跳过。

stop slave;set global sql_slave_skip_counter=1;start slave;

如果这种情况很多,需要针对这种错误专门写相关脚本。


主键重复

在slave已经有该记录,又在master上插入了同一条记录。

Last_SQL_Error: Could not execute Write_rows event on table hcy.t1; Duplicate entry ‘2‘ for key ‘PRIMARY‘, Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event‘s master log mysql-bin.000006, end_log_pos 924

解决方法:

在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    |       | +-------+---------+------+-----+---------+-------+

删除重复的主键

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: YesSlave_SQL_Running: Yes……mysql> select * from t1 where id=2;

在master上和slave上再分别确认一下。


更新丢失

在master上更新一条记录,而slave上找不到,丢失了数据。

Last_SQL_Error: Could not execute Update_rows event on table hcy.t1; Can‘t find record in ‘t1‘, Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event‘s master log mysql-bin.000010, end_log_pos 794

解决方法:

在master上,用mysqlbinlog 分析下出错的binlog日志在干什么。

/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000010 | grep -A ‘10‘ 794

#120302 12:08:36 server id 22  end_log_pos 794  Update_rows: table id 33 flags: STMT_END_F### UPDATE hcy.t1### WHERE###   @1=2 /* INT meta=0 nullable=0 is_null=0 */###   @2=‘bbc‘ /* STRING(4) meta=65028 nullable=1 is_null=0 */### SET###   @1=2 /* INT meta=0 nullable=0 is_null=0 */###   @2=‘BTV‘ /* STRING(4) meta=65028 nullable=1 is_null=0 */# at 794#120302 12:08:36 server id 22  end_log_pos 821  Xid = 60COMMIT/*!*/;DELIMITER ;# End of log fileROLLBACK /* added by mysqlbinlog */;/*!50003 SET [email protected]_COMPLETION_TYPE*/;

在slave上,查找下更新后的那条记录,应该是不存在的。

mysql> select * from t1 where id=2;Empty set (0.00 sec)

然后再到master查看

mysql> select * from t1 where id=2;+----+------+| id | name |+----+------+|  2 | BTV  | +----+------+1 row in set (0.00 sec)

把丢失的数据在slave上填补,然后跳过报错即可。

mysql> insert into t1 values (2,‘BTV‘);Query OK, 1 row affected (0.00 sec)

mysql> select * from t1 where id=2;    +----+------+| id | name |+----+------+|  2 | BTV  | +----+------+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……

1236错误, 二进制文件缺失

误删二进制文件等各种原因,导致主库mysql-bin.000012文件丢失,从库同步失败。

Master_Log_File: mysql-bin.000012Slave_IO_Running: NoSlave_SQL_Running: YesLast_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file‘
  • 首先停止从库同步

    slave stop;
  • 查看主库日志文件和位置
    mysql> show master logs;+------------------+-----------+| Log_name         | File_size |+------------------+-----------+| mysql-bin.000013 |       154 |+------------------+-----------+
  • 回从库,使日志文件和位置对应主库
    CHANGE MASTER TO MASTER_LOG_FILE=‘log-bin.000013‘,MASTER_LOG_POS=154;
  • 最后,启动从库:

```bash
    slave start;

show slave status\G;

Master_Log_File: mysql-bin.000013
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Last_IO_Error:
    ```


中继日志损坏

slave的中继日志relay-bin损坏。

Last_SQL_Error: Error initializing relay log position: I/O error reading the header from the binary logLast_SQL_Error: Error initializing relay log position: Binlog has bad magic number;  It‘s not a binary log file that can be used by  this version of MySQL

1、手工修复
解决方法:找到同步的binlog和POS点,然后重新做同步,这样就可以有新的中继日值了。

例子:

mysql> show slave status\G;*************************** 1. row ***************************              Master_Log_File: mysql-bin.000010          Read_Master_Log_Pos: 1191               Relay_Log_File: vm02-relay-bin.000005                Relay_Log_Pos: 253        Relay_Master_Log_File: mysql-bin.000010             Slave_IO_Running: Yes            Slave_SQL_Running: No              Replicate_Do_DB:           Replicate_Ignore_DB:            Replicate_Do_Table:        Replicate_Ignore_Table:       Replicate_Wild_Do_Table:   Replicate_Wild_Ignore_Table:                    Last_Errno: 1593                   Last_Error: Error initializing relay log position: I/O error reading the header from the binary log                 Skip_Counter: 1          Exec_Master_Log_Pos: 821

Slave_IO_Running :接收master的binlog信息                   Master_Log_File                   Read_Master_Log_Pos

Slave_SQL_Running:执行写操作                   Relay_Master_Log_File                   Exec_Master_Log_Pos

以执行写的binlog和POS点为准。

Relay_Master_Log_File: mysql-bin.000010Exec_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)

mysql> show slave status\G;*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 192.168.8.22                  Master_User: repl                  Master_Port: 3306                Connect_Retry: 10              Master_Log_File: mysql-bin.000010          Read_Master_Log_Pos: 1191               Relay_Log_File: vm02-relay-bin.000002                Relay_Log_Pos: 623        Relay_Master_Log_File: mysql-bin.000010             Slave_IO_Running: Yes            Slave_SQL_Running: Yes              Replicate_Do_DB:           Replicate_Ignore_DB:            Replicate_Do_Table:        Replicate_Ignore_Table:       Replicate_Wild_Do_Table:   Replicate_Wild_Ignore_Table:                    Last_Errno: 0                   Last_Error:                  Skip_Counter: 0          Exec_Master_Log_Pos: 1191              Relay_Log_Space: 778              Until_Condition: None               Until_Log_File:                 Until_Log_Pos: 0           Master_SSL_Allowed: No           Master_SSL_CA_File:            Master_SSL_CA_Path:               Master_SSL_Cert:             Master_SSL_Cipher:                Master_SSL_Key:         Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No                Last_IO_Errno: 0                Last_IO_Error:                Last_SQL_Errno: 0               Last_SQL_Error: 

2、Ibbackup
各种大招都用上了,无奈slave数据丢失过多,ibbackup(需要银子)该你登场了。

Ibbackup热备份工具,是付费的。xtrabackup是免费的,功能上一样。

Ibbackup备份期间不锁表,备份时开启一个事务(相当于做一个快照),然后会记录一个点,之后数据的更改保存在ibbackup_logfile文件里,恢复时把ibbackup_logfile 变化的数据再写入到ibdata里。

Ibbackup 只备份数据( ibdata、.ibd ),表结构.frm不备份。

MySQL主从复制常见故障及解决方法?


1.1.1故障1:从库数据与主库冲突

show slave status; 报错:且show slave status\G

Slave_I/O_Running:Yes

Slave_SQL_Running:No

Seconds_Behind_Master:NULL

Last_error:Error ‘Can‘t create database ‘xiaoliu‘; database exists‘ on query. Default  

database:‘xiaoliu‘.query:‘create database xiaoliu‘


解决方法1:

stop slave;

set global sql_slave_skip_counter = 1; #将同步指针向下移动一个,如果多次不同步可以重复操作

解决方法2:在从库配置文件中配置,直接跳过不影响业务的错误号

grep slave-skip /etc/my.cnf

slave-skip-errors = 1032,1062,1007

1.1.2故障2:MySQL主从复制延迟问题原因和解决方案

问题1:主库的从库太多,导致复制延迟

从库数量一般 3—5个为宜,要复制的节点过多,导致复制延迟

问题2:从库硬件配置比主库差,导致延迟

查看Master和Slave的配置,可能因为配置不当导致复制的延迟

问题3:慢SQL语句过多

假如一条语句执行时间超过2秒, 就需要进行优化进行调整

问题4:主从复制设计问题

主从复制单线程,如果主库的写入并发太大,来不及传送到从库就会导致延迟

更高版本的MySQL可以支持多线程复制,门户网站则会自己开发多线程同步功能

问题5:主从库之间的网络延迟

主从库网卡、网线、连接的交换机等网络设备都可能成为复制的瓶颈

导致复制延迟,另外跨公网主从复制很容易导致主从复制延迟

问题6:主库读写压力大,导致复制延迟

主库硬件要好一些,架构前端要加buffer缓存层

时间: 2024-10-08 21:33:04

MySQL主从同步报错故障处理记录的相关文章

MySQL主从同步报错排错结果及修复过程之:Slave_SQL_Running: No

起因调查: 收到大量邮件报警想必事出有因,就问同事到底发生了什么?同事登录从库查看,发现出现如下报错提示,表示与主库同步失败,一直卡在哪里,看他弄了两个多小时,问题越来越多,解决一个恢复平静了一两分钟又不行了....于是报警的邮件又是一封又一份...于是向我求助.登录从库后发现: 其中一台从库报错内容为: 1 mysql> show slave status\G; 2 3 Slave_IO_Running: Yes 4 Slave_SQL_Running: No 5 6 Last_Errno:

MySQL主从同步报错,server-id一致导致报错

今天新加入一台从库,进行同步master数据,但是my.cnf配置文件直接拷贝,没修改server-id,导致报错: 2017-04-01 14:57:16 140661325472512 [Note] Slave: received end packet from server, apparent master shutdown:  2017-04-01 14:57:16 140661325472512 [Note] Slave I/O thread: Failed reading log e

线上MYSQL同步报错故障处理总结(转)

前言 在发生故障切换后,经常遇到的问题就是同步报错,数据库很小的时候,dump完再导入很简单就处理好了,但线上的数据库都150G-200G,如果用单纯的这种方法,成本太高,故经过一段时间的摸索,总结了几种处理方法. 生产环境架构图 目前现网的架构,保存着两份数据,通过异步复制做的高可用集群,两台机器提供对外服务.在发生故障时,切换到slave上,并将其变成master,坏掉的机器反向同步新的master,在处理故障时,遇到最多的就是主从报错.下面是我收录下来的报错信息. 常见错误 最常见的3种情

线上MYSQL同步报错故障处理方法总结

前言 在发生故障切换后,经常遇到的问题就是同步报错,下面是最近收集的报错信息. 记录删除失败 在master上删除一条记录,而slave上找不到 Last_SQL_Error: Could not execute Delete_rows event on table hcy.t1; Can't find record in 't1', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysq

故障案例:主从同步报错Fatal error: The slave I/O thread stops because master and slave have equal MySQL server

场景一:因为数据量非常,大概有1.4T,需要在原先master1-slave1的情况下再创建一个库slave2,并且挂在slave1下,即master1-slave1-slave2的结构.为了方便,当时停掉从库salve1,show master status记录状态,开启log_slave_updates,并且关闭salve1,然后将这个从库的data文件夹直接copy到新的从库,结果在创建slave2和slave1的主从关系时报错 Fatal error: The slave I/O thr

MySQL 主从同步(1) - 概念和原理介绍 以及 主从/主主模式 部署记录

Mysql复制概念Mysql内建的复制功能是构建大型高性能应用程序的基础, 将Mysql数据分布到多个系统上,这种分布机制是通过将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收从那时起

mysql主从同步中出现的问题梳理

之前部署了Mysql主从复制环境(MySQL复制环境(主从/主主)部署总结性梳理),在mysql同步过程中会出现很多问题,导致数据同步异常.以下梳理了几种主从同步中可能存在的问题:1)slave运行过慢不能与master同步,也就是MySQL数据库主从同步延迟MySQL数据库slave服务器延迟的现象是非常普遍的,MySQL复制允许从机进行SELECT操作,但是在实际线上环境下,由于从机延迟的关系,很难将读取操作转向到从机.这就导致了有了以下一些潜规则:"实时性要求不高的读取操作可以放到slav

MySQL主从同步、读写分离配置步骤

现在使用的两台服务器已经安装了MySQL,全是rpm包装的,能正常使用. 为了避免不必要的麻烦,主从服务器MySQL版本尽量保持一致; 环境:192.168.0.1 (Master) 192.168.0.2 (Slave) MySQL Version:Ver 14.14 Distrib 5.1.48, for pc-linux-gnu (i686) using readline 5.1 1.登录Master服务器,修改my.cnf,添加如下内容: server-id = 1 //数据库ID号,

mysql 主从同步实验细解

mysql  主从同步实验细解 一.实验环境 实验环境 192.168.9.108 为master 192.168.9.109 为slave 数据库版本:version              5.1.73 安装方式:采用的yum 安装 源为163的源 系统版本:centos 6.5 1.查看系统版本 [[email protected] ~]# cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m 二.实验准备 1.安装my