问题记录——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密码

 

posted @ 2025-08-29 10:42  太阳的阳ฅ  阅读(9)  评论(0)    收藏  举报