Mysql数据丢失问题
binlog插入记录正常,没有回滚记录;查到两条删除记录但都不是丢失数据的记录。
Searching 1 file for "ROLLBACK"
0 matches
Searching 1 file for "DELETE FROM `dstore2.0`.`component_info`"
<untitled 23>:
918753 # at 11081383
918754 #230625 9:07:14 server id 1 end_log_pos 11081551 CRC32 0x1af3c342 Delete_rows: table id 139 flags: STMT_END_F
918755: ### DELETE FROM `dstore2.0`.`component_info`
918756 ### WHERE
918757 ### @1='ojFXE8ZOcSsZK57fYFuFz'
.....
918766 ### @10='2023-06-25 09:07:02'
918767 ### @11='2023-06-25 09:07:02'
918768: ### DELETE FROM `dstore2.0`.`component_info`
918769 ### WHERE
918770 ### @1='ojFXE8ZOcSsZK57fYFuFz'
如何才能定位到数据是如何丢失的?
看看log有没有提示信息
下面建一个mdc库里面建一张test表插入两条数据,如下图所示:
然后备份mdc库的test表:
mysqlData]# mysqldump -uroot -p'Qqmima917@' mdc test --single-transaction --master-data=1 --flush-logs > `date +%F`-mdc_test.sql;
然后继续插入几条数据:
insert into mdc.test values (3,'xiaomao'),(4,'lisi');
然后删除整张表:
drop table mdc.test;
然后查看二进制日志,发现下面有三个二进制文件:
根据问题描述,发现数据丢失的记录既没有回滚记录,也没有对应的删除记录。这种情况下,可能是由于误操作或者其他服务的影响导致的数据丢失。针对这种情况,我们可以通过以下步骤来定位数据丢失问题:
show variables like '%log_bin%'
如果第一个变量log_bin是ON,说明数据库开启了log_bin。在这种情况下,我们可以将历史操作数据恢复。
通过查询相关日志或者业务数据,确认数据丢失的时间段。然后查找对应的binlog文件名。可以使用如下命令:
show binary logs;
这个命令可以列出所有的binlog文件名及其对应的起始和结束时间。
找到对应时间段的binlog文件名后,使用mysqlbinlog命令查看对应的binlog日志。可以使用如下命令:
mysqlbinlog --start-datetime='开始时间' --stop-datetime='结束时间' D:/Develop/Mysql/mysql-8.0.27-winx64/data/binlog.000067 > binlog.txt
该命令会将对应时间段的binlog日志导出到文件binlog.txt中,方便后续查看。
将导出的binlog日志打开,通过关键字搜索的方式,查找可能导致数据丢失的操作记录。可以根据业务特点,确定搜索关键字。例如,如果是新增数据的记录丢失,可以搜索insert或replace等关键字;如果是更新数据的记录丢失,可以搜索update关键字。
根据分析的binlog日志,尝试重现数据丢失的场景,确定造成数据丢失的原因。这个过程中,需要结合业务及其他服务的操作记录,找到可能对数据造成影响的操作或服务,并进行排查和分析。
如果以上步骤无法定位数据丢失的问题,为了保障数据的安全,可以考虑在后续的运维工作中,增加数据备份及恢复方案,建立数据异常监控机制等预防措施。