该方案针对于 linux 环境下恢复数据,windows 下不太清楚能不能用,可以参考下。
mysql 数据库的恢复是通过 MySQL 本身的 binlog 日志来恢复丢失或删除的数据,binlog 日志文件中记录着数据库中所有的操作,CRUD/Rollback 操作都会记录在日志中。
该方式是通过通过 binlog 日志恢复,需要保证数据库开启了 binlog 日志。
查询是否开启 binlog 日志的 sql 脚本:
如果没开启的话,这个方案恢复不了了的。
show variables like '%log_bin%';
show variables like '%datadir%';
my2sql 插件使用的限制条件:
在mysql 安装目录 bin 目录中放入插件 my2sql,然后给 my2sql 赋权限。
chmod 777 my2sql
创建一个空文件夹 “tmpdir”,然后给个 777 的权限。
mkdir tmpdir
将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文件中的时间找到对应的节点,有了开始节点与结束节点,就可以恢复指定时间段的数据了。
在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文件。
将提取出的文件,在文本编辑器中打开,检查对应的 sql 是否正确且完整,要注意 delete 与 rollback语句 。
sql 审查没问题了,然后在库里面将 sql 文件执行下就好了,推荐使用 navicat 15 工具,选运行 sql 文件来执行sql,到此,数据就算恢复完成了。
涉及正式数据一定要慎重,请不要在生产环境执行任何修改生产环境的 sql 脚本,要定期备份,或者做主从复制的模式,主机只对应用程序开放连接,其余需要数据库的,都连接从库。
附一个 my2sql 工具详解的博客地址,有兴趣的可以了解一下 my2sql 工具。
地址:https://blog.csdn.net/liuhanran/article/details/107425016