环境/读前须知
需要开启binlog
MYSQL版本 | log_bin | 难易程度(共5级) |
---|---|---|
8.0/5.7 | true | 4 |
需求分析
需要恢复数据到某个时间点, 比如3天前.
一般的做法是找到3天前的备份, 做全备恢复, 然后跑binlog跑到指定时间点即可.
但现在没得备份, 好歹还有binlog. 那就只有生成回滚sql了.
思路
导出需要回滚的数据, 使用binlog2sql/my2sql等工具生成回滚sql. 导入数据到测试库. 再导入回滚sql. 再导出已经恢复的测试库数据到生产库.
步骤参考
生产库/备库导出需要的数据
--master-data 是因为我需要知道后面解析Binlog要解析到哪里. 修改.sql文件注释掉 CHANGE MASTER语句
代码语言:javascript复制mysqldump -u root -B db1 --master-data --set-gtid-purged=OFF -p > db1_20230524.sql
生成回滚SQL
建议使用还在维护的工具. 有的解析binlog的工具都好几年没有维护了...
binlog2sql使用参考
-B 生成回滚sql
-d 指定数据库
代码语言:javascript复制./binlog2sql -uroot -p -P3306 --start-file='m3308.00025' --start-datetime='2023-05-22 00:00:00' --stop-file='m3308.00028' --stop-position=4 -d db1 -B > db1_flash_back_20230524.sql
binlog_rollback
引用的官方的例子
代码语言:javascript复制./binlog_rollback.exe -m repl -w 2sql -M mysql -t 4 -mid 3331 -H 127.0.0.1 -P 3306 -u xxx -p xxx -dbs db1,db2 -tbs tb1,tb2 -sbin mysql-bin.000556 -spos 107 -ebin mysql-bin.000559 -epos 4 -e -f -r 20 -k -b 100 -l 10 -o /home/apps/tmp -dj tbs_all_def.json
my2sql
基于my2fback、binlog_rollback工具二次开发而来
代码语言:javascript复制./my2sql -user root -password 123456 -port 3314 -databases db2023 -work-type rollback -start-file m3314.000229 -start-datetime "2023-05-23 00:00:00" -stop-file m3314.000234 --stop-datetime "2023-05-23 14:28:53"
导入数据到测试库
代码语言:javascript复制mysql -uroot -p < db1_20230524.sql
导入回滚数据到测试库
注意my2sql生成的.sql文件是基于binlog文件来的, 所以导入测试库的时候要从后往前导, 比如
代码语言:javascript复制mysql -uroot -p < rollback.233.sql
mysql -uroot -p < rollback.232.sql
mysql -uroot -p < rollback.231.sql
最后验证数据没得问题了, 就可以再导出来, 然后导入生产库.
总结
备份很总要, 要定期检查备份.
binlog也很重要, 保留期限尽量长一点. 起码得一周吧.
binlog转为sql的工具很多, 但很多都没有维护了.... 使用起来可能会遇到各种坑, 如果不急的话, 可以慢慢研究, 如果急的话, 建议使用其它解析binlog的工具. 如果是正向跑binlog的话, 就不需要解析成sql, 直接导入即可mysqlbinlog m3308.0000x | mysql -u -p