[MYSQL案例][006] 无备份恢复数据

2023-05-24 13:15:00 浏览数 (2)

环境/读前须知

需要开启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

0 人点赞