问题记录——mysql数据丢失,基于binlog还原
环境说明:mysql一主一从,基于gtid配置的同步
问题背景:有人误操作将其中一个数据库(test)数据使用原始数据将当前数据全都覆盖了,执行前也没有数据库备份,导致了数据丢失
解决方案:只能基于当前binlog信息来执行回放操作,这里还有一个问题,因为一开始基于位置和时间回放都没有成功,猜测是因为gtid被标记执行完成跳过操作了,以下是成功的操作
mysqlbinlog \ --no-defaults \ --database=test \ --stop-datetime="2025-08-27 23:59:59" \ --skip-gtids \ mysql-bin.000002 mysql-bin.000003 > test_recovery.sql
--no-defaults 参数的作用是跳过所有默认配置文件的读取,确保 mysqlbinlog 仅根据命令行中指定的参数运行,避免配置文件中的设置干扰解析结果
--skip-gtids 生成SQL时跳过GTID标识
检查test_recovery.sql,确认无误后执行此sql
最终数据成功还原(内网操作的,就不贴截图了)
基于binlog恢复的方法
(1)一般的恢复:备份的二进制日志内容全部恢复
格式:
mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u用户名 -p密码
(2)基于时间点的恢复:便于跳过某个发生错误的时间点实现数据恢复
格式:
从日志开头截止到某个时间点的恢复:
mysqlbinlog [--no-defaults] --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u用户名 -p密码
从某个时间点到日志结尾的恢复:
mysqlbinlog [--no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u用户名 -p密码
从某个时间点到某个时间点的恢复:
mysqlbinlog [--no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’ --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u用户名 -p密码
(3)基于位置的恢复:可能在同一时间点既有错误的操作也有正确的操作,基于位置进行恢复更加精准
格式:
mysqlbinlog --stop-position=’操作id’ 二进制日志 |mysql -u用户名 -p密码
mysqlbinlog --start-position=’操作id’ 二进制日志 |mysql -u用户名 -p密码

浙公网安备 33010602011771号