首页 > 数据库 > MySQL > 正文

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

2024-07-24 12:35:58
字体:
来源:转载
供稿:网友
  在发生故障切换后,经常遇到的问题就是同步报错,下面是最近收集的报错信息。
 
  记录删除失败
  在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: Yes
  Slave_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 = 60
  COMMIT/*!*/;
  DELIMITER ;
  # End of log file
  ROLLBACK /* added by mysqlbinlog */;
  /*!50003 SET COMPLETION_TYPE=@OLD_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上填补,然后跳过报错即可。
 
  1236错误, 二进制文件缺失
  误删二进制文件等各种原因,导致主库mysql-bin.000012文件丢失,从库同步失败。

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表