mysql 中断查询_MySQL数据库双主同步异常故障处理

本文介绍了在MySQL双主同步环境中遇到的复制异常问题,包括SQL线程断开和主键冲突。通过日志分析确定问题原因,采取数据核对、主键冲突处理、数据恢复等步骤,最终成功恢复双主复制功能并确保数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[概述]

在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动。因此,如果是双主或者多主,就会增加mysql入口,增加高可用。不过多主需要考虑自增长ID问题,这个需要特别设置配置文件,比如双主,可以使用奇偶,总之,主之间设置自增长ID相互不冲突就能完美解决自增长ID冲突问题。

[故障背景]

Linux系统环境:SUSE12.4

MySQL数据库版本:5.7.29

Mysql数据库架构:双主

由于业务侧在做双主架构选择的时候,没有做VIP高可用冗余,所以只能实现普通的双主基本复制功能,分别基于maser01和master02之间的读写同步复制。

[故障发现]

生产中经监控平台发现MySQL数据库双主复制中SQL复制线程断开,经排查发现双主复制出现了异常,具体报错信息如下图所示:在master02数据库服务器上发现,同步master01数据库服务器的SQL线程断开了,截图如下:

d65170777d12af2da4d28c0e1c9f10cf.png

此时,检查master01数据库服务器的同步情况,发现master01同步master02的复制目前是正常显示的。

e23acdf9e141faf4cdd846b973468543.png

[故障分析]

4.1日志分析

通过查看日志文件发现如下报错信息:

cd81a1766bac77b4bdf168b62697d84a.png

通过上面日志分析,发现双主同步复制异常存在两种情况:

A:master01的表数据可能被truncate导致master02同步异常中断;

B:或者是master01和master02之间数据复制过程中主键冲突导致同步异常中断。最后我们来清查一下对应报错的表数据在master01和master02两个库中的数据是否一致,如果不一致,那就说明其中一个库中的数据被清理了,或者另一个库中的表数据同步一直不一致导致同步异常。

4.2表数据核对

1)经报错信息查询该表数据统计记录master02的表数据量为:462740条。

2e78289acd632ff7ce027de05d956b74.png

2)同时也记录了master01数据库上,该表的数据量为:462733条。与master02对比发现数据量少了7条。

e9fc4b3b79409ad6d4fd1bbb1d0a1e2b.png

4.3主键冲突

将master02上的这个表全表导出备份后,再将该表数据导入到master01中,最后还是报该表存在数据主键冲突,报错如下:

4d1e905930e67bf448741b67e87ec605.png

[故障处理]

5.1表数据恢复

在导入过程中,需要关闭binlog的记录setsql_log_bin=0,避免导入数据表时报ID主键列冲突数据刷新到日志中,这样master01的表数据就会被master02的表数据全部置换,在主主同时写同时复制的情况下,之前一样的数据就没有了,最后剩下的是7条不一致的数据。虽然把主主复制功能恢复了,但是这个cer_work_order_temp表数据被新的二进制文件数据置换掉了,最终导致这表数据丢失。

45e212c0bd834b6c9f393bd89e5f0654.png

5.2全量和增量恢复

通过全备+增量备份在测试环境对cer_work_order_temp表进行数据恢复,先找到增量起始点position'812016541'结合二进制日志进行恢复该表在master02服务器上的数据。

8a0cfe59bc87d81cc65e841c3f3003d4.png

第一个binlog日志恢复命令如下:

mysql-bin.000025一次执行不完,分两次执行:

第一次:

mysqlbinlog --no-defaults --start-position="812016541" --stop-position="883789149" mysql-bin.000025 |mysql --login-path=myconn

第二次:

mysqlbinlog --no-defaults --start-position="883789256" mysql-bin.000025 |mysql --login-path=myconn

第二个binlog日志恢复命令如下:

因第二个日志mysql-bin.000026事务量比较大,如果像第一个binlog那样恢复的话,时间会很慢,所以第二个日志binlog我们采用sql文件导入方式:

根据发生的故障时间点,进行二进制日志数据的提取,提取方式如下所示:

mysqlbinlog   --stop-datetime='2020-07-07 23:59:59'   mysql-bin.000026   > new_026.sql

5.3主键修复

删除原表主键,再重建新表及1条索引,目的为了导入数据不冲突,并且导入速度快。

删除主键并建索引:

alter table cer_work_order_temp drop primary key;

create index aa on cer_work_order_temp(serial_no);

创建新的aa表并把cer_work_order_temp信息同步:

create table aa as

select *,count(distinct serial_no) from cer_work_order_temp group by serial_no;

5.4导入修复好的表数据

再把new_026.sql数据导入数据库即可

[mysql@vgasmrzfaceresource02 ~]$cat mysql_in.sh

mysql --login-path=myconn<

use smzrz;

set names utf8mb4;

select database();

set sql_log_bin=0;

source /data/backup/new_026.sql

EOF

5.5校验数据

最终数据查询,如下查询已经恢复到原始数据量。

b6c55564d56d85b0f98005f3f95eaf1e.png

最后把这个表数据mysqldump到master01/master02数据库,再把双主复制功能恢复就可以了。

[故障总结]

此次故障恢复还是算流畅的,没有遇到较大的难点,数据库服务器恢复正常后,也通知业务侧那边进行数据校验,同时得到他们的认可数据恢复一致,没有问题再现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值