MySQL使用bin-log将数据恢复到某个时间点
binlog的三种模式
- statement:记录每一条修改数据的sql
- row:保存哪条记录被修改
- mixed:兼顾前两者的优点。
# 查看binlog有没有开启 SHOW VARIABLES LIKE 'log_bin%'; # 查看当前binlog的模式 SHOW VARIABLES LIKE 'binlog%';
在配置文件中添加一行:binlog_format="ROW",即可设置成row模式,其他模式同理
-- 查看当前是在哪个日志文件中 SHOW MASTER STATUS; # 截断日志文件,重新定向到新的日志文件中 # 每次操作binlog恢复前,都需要执行下此命令,能够保证之前的日志文件不会再有新的日志在到这个文件中,影响恢复。 FLUSH LOGS; # 查询出这些日志文件保存的路径 show variables like '%datadir%'; # get所有的操作记录 SHOW BINLOG EVENTS IN 'mysql-bin.000001';
cd /var/lib/mysql # get这个binlog文件所有的操作记录, 有详细时间 mysqlbinlog --no-defaults mysql-bin.000001 # get某个区间的操作记录 mysqlbinlog --no-defaults --start-position=120 --stop-position=220226 mysql-bin.000001 # 在后面加管道符|mysql -uroot -p,用这个区间的操作记录去恢复到数据库 mysqlbinlog --no-defaults --start-position=120 --stop-position=220226 mysql-bin.000001 ||mysql -uroot -p mysqlbinlog --stop-datetime="2022-2-26 20:17:33" mysql-bin.000001 |mysql -uroot -p mysqlbinlog --start-datetime="2022-2-25 20:17:00" --stop-datetime="2022-2-26 20:17:33" mysql-bin.0000* |mysql -uroot -p
注意事项
- 每次重启mysql服务都会创建一个新的binlog文件
FLUSH LOGS;
也会创建一个新的binlog- 恢复之前建议
FLUSH LOGS;
生成一个新的binlog,把恢复操作都写到新的binlog中。 - 恢复的过程中可能遇到主键冲突,可能是有binlog记录了mysql的一些自带数据的创建,应该找好恢复的开始位置,别把mysql数据的创建记录也恢复了。
- 去找这些binlog,以自己数据库的创建position开始,一个个binlog去恢复,直到最近被删除前的位置。
- 建议以位置position或者整个binglog文件恢复。当然也可以
mysql-bin.0000*
匹配所有binlog然后指定--start-datetime
和--stop-datetime
去恢复。 - position的选取,取
SHOW BINLOG EVENTS IN 'mysql-bin.000001';
结果的End_log_pos
列的值。
清空binlog
先用navicat导出一份数据,
删除数据库,
然后清空binlog文件
cd /var/lib/mysql rm -f mysql-bin.0000* :> mysql-bin.index
重启mysql
systemctl restart mysql
用navicat导入数据,
查看binlog日志
SHOW BINLOG EVENTS IN 'mysql-bin.000001';
生成新的binlog
FLUSH LOGS;
本文来自博客园,作者:云白Li,转载请注明原文链接:https://www.cnblogs.com/libaiyun/p/16462473.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~