前言

该方案针对于 linux 环境下恢复数据,windows 下不太清楚能不能用,可以参考下。

mysql 数据库的恢复是通过 MySQL 本身的 binlog 日志来恢复丢失或删除的数据,binlog 日志文件中记录着数据库中所有的操作,CRUD/Rollback 操作都会记录在日志中。

该方式是通过通过 binlog 日志恢复,需要保证数据库开启了 binlog 日志。

一、恢复数据需要满足的条件

查询是否开启 binlog 日志的 sql 脚本:
如果没开启的话,这个方案恢复不了了的。

 show variables like '%log_bin%';

在这里插入图片描述
查看binlog存放日志文件目录

  show variables like '%datadir%';

my2sql 插件使用的限制条件:

  • 使用回滚/闪回功能时,binlog格式必须为row,且binlog_row_image=full, DML统计以及大事务分析不受影响,只能回滚DML, 不能回滚DDL
  • 支持指定-tl时区来解释binlog中time/datetime字段的内容。开始时间-start-datetime与结束时间-stop-datetime也会使用此指定的时区, 但注意此开始与结束时间针对的是binlog event header中保存的unix timestamp。结果中的额外的datetime时间信息都是binlog event header中的unix timestamp
  • 此工具是伪装成从库拉取binlog,需要连接数据库的用户有SELECT, REPLICATION SLAVE, REPLICATION CLIENT权限

插件下载地址,下载免费:my2sql下载地址免费
在这里插入图片描述

二、开始恢复数据

1、第一步

在mysql 安装目录 bin 目录中放入插件 my2sql,然后给 my2sql 赋权限。

  chmod 777 my2sql

2、第二步

创建一个空文件夹 “tmpdir”,然后给个 777 的权限。

 mkdir tmpdir

3、第三步

binlong文件下载到本地,然后转换成sql格式找到对应的节点(pos点),节点名(pos点)是纯数字的时间戳,根据节点可以恢复指定时间段的数据。
binlog 文件格式转换,首先保证本地数据库与生产环境数据库版本要一致,然后输入以下命令(不要有换行符号):

mysqlbinlog --no-defaults --base64-output=decode-rows -v 
--start-datetime="2022-08-09 08:00:00" --stop-datetime="2022-08-17 10:35:00" 
C:\MySQL\MySQL8.0\Desktop\mysql-bin.000039 -r ./output1.sql

说明:

mysqlbinlog --no-defaults --base64-output=decode-rows -v 
--start-datetime="开始时间" --stop-datetime="结束时间"  
'binlog文件的绝对路径' -r ./'转换后的文件名称'

转换后的sql文件中的节点(pos点):
可以根据binlog文件中的时间找到对应的节点,有了开始节点与结束节点,就可以恢复指定时间段的数据了。
在这里插入图片描述

4、第四步

在bin目录,输入以下命令(不要有换行):

./my2sql -user root -password 123456 -host 127.0.0.1 -port 3308  
-mode file -local-binlog-file ./mysql-bin.000038  -work-type 2sql  
-start-file mysql-bin.000038  -start-pos 606463342  -
stop-file mysql-bin.000038 -stop-pos 651675557  -output-dir ./tmpdir

说明:

./my2sql -user '账号' -password '密码' -host 'ip (bin 目录就是127)' -port '端口'  -mode file -local-binlog-file ./'binlog 文件名'  -work-type 2sql  -start-file 'binlog 文件名'  -start-pos '开始节点(节点数字在binlog日志中有)'  -stop-file 'binlog 文件名' -stop-pos '结束节点(节点数字在binlog日志中有)'  -output-dir ./tmpdir

执行成功后,会将 binlog 文件中对应节点的 sql 语句提取到文件中,我本次共生成了三个文件,分别为 biglong_trx.txt 、binlog_status.txt 、forward.38.sql

文件说明:
biglong_trx.txt:
该文件没什么内容,没去深入了解,没什么用,暂不关注。
binlog_status.txt:
该文件是说明 binlog 文件的DML统计信息,比如开始节点到结束节点中,都执行了哪些 sql ,什么时候执行的,执行了什么操作,影响了几行数据,什么执行结束的。
forward.38.sql:
该文件存的是从 binlog 中提取出来的 sql 语句,这个语句是可以在数据库中执行的sql文件。

5、第五步

将提取出的文件,在文本编辑器中打开,检查对应的 sql 是否正确且完整,要注意 delete 与 rollback语句

6、 第六步

sql 审查没问题了,然后在库里面将 sql 文件执行下就好了,推荐使用 navicat 15 工具,选运行 sql 文件来执行sql,到此,数据就算恢复完成了。

结束语:

涉及正式数据一定要慎重,请不要在生产环境执行任何修改生产环境的 sql 脚本,要定期备份,或者做主从复制的模式,主机只对应用程序开放连接,其余需要数据库的,都连接从库。
附一个 my2sql 工具详解的博客地址,有兴趣的可以了解一下 my2sql 工具。
地址:https://blog.csdn.net/liuhanran/article/details/107425016


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐