误删MySQL binlog 还原 恢复已删除的数据 实战 超详细
时间:2025-06-24 12:21:54 来源:新华社
【字体:  

硬盘价格󿀌无价数据,数据库执行󿀌仔细操作༁

binlog日志还原不适用于直接删表删库的误操作!

目录。

实战恢复。

1、binlog数据导出相关时间。

2、找到相应的句子和pos间隔。

3、sql导出改变区间。

4、将binlog导出的sql转换为反向修复sql。

5、执行sql恢复。


背景。

在 2024年9月12日 在操作过程中,SQL拼写错误,导致全表数据被误刷。这个问题导致数据丢失󿀌对业务运营有严重影响。见下面修复的数据文档。从而进一步写出错误的删除数据,binlog恢复方案。

误修改恢复 看看我的另一篇文章。

MySQL生产环境 where条件写错了全表数据,#xff0c;binlog恢复。icon-default.png?t=O83Ahttps://blog.csdn.net/id_is_null/article/details/142253710。

恢复流程。

1、确定误操作时间。

        2024年9月14日 10点55-11点05。

2、确定目标库表和执行语句。

       。 库:newsee-budget     表:ns_budget_loan_bak。

        执行语句:delete from ns_budget_loan_bak;

3、binlog数据导出相关时间。

4、找到相应的句子和pos间隔。

5、sql导出改变区间。

6、将binlog导出的sql转换为反向插入sql。

7、执行sql恢复。

实战恢复。

1、binlog数据导出相关时间。

        首先去binlog目录找,确定哪个binlog文件误操作时间。

        。

        从这里可以看出是在 binlog.000925 文件里。

        binlog日志将在相应的时间导出:

mysqlbinlog --no-defaults --start-datetime='2024-09-14 10:55:0' --stop-datetime='2024-09-14 11:05:0' --base64-output=decode-rows -d newsee-budget  -vv binlog.000934 > /root/test.sql。

2、找到相应的句子和pos间隔。

2、找出相应的句子和pos间隔。

        如果找不到,可以看看顶部链接实战修复误修改的文章。        。

结尾pos 107646361。

       。

        开始pos 107070608。

        。

3、导出错误删除区间的sql。

        这时,我们从binlog中导出这个区间的sql。

mysqlbinlog --no-defaults --start-position=107070608 --stop-position=107646361 --base64-output=decode-rows -vv binlog.000934 > /root/test1.sql。

        可以看出,导出的sql只是刚才连续的sql。

        可以看出,导出的sql只是刚才连续的sql。

        。

        。4、将binlog导出的sql转换为反向修复sql。

        。

能自己理解意思󿀌以及参考文章顶部的另一篇文章。

        shell sql字段有换行。

sed -n '/###/'##//##//;p test1.sql > test2.sqlsed 's/### //g' test2.sql > test3.sqlsed 's#/.*##g' test3.sql > test4.sqlsed 's/^DELETE FROM/INSERT INTO/' test4.sql > test5.sqlsed ':a;N;$!ba;s/\nWHERE/ VALUES \(/g' test5.sql > test6.sqlsed 's/@[0-9]*=//g' test6.sql > test7.sqlsed 's/$/,/g' test7.sql > test8.sqlsed 's/VALUES (,/VALUES (/g' test8.sql > test9.sqlsed ':a;N;$!ba;s/,\nINSERT/\);\nINSERT/g' test9.sql > test10.sqlsed '$ s/.$/);/' test10.sql > test11.sql。ba;s/,\nINSERT/\);\nINSERT/g' test9.sql > test10.sqlsed '$ s/.$/);/' test10.sql > test11.sql。

        shell sql一行一行。

sed -n '####/#399#;p test1.sql > test2.sqlsed 's/### //g' test2.sql > test3.sqlsed 's#/.*##g' test3.sql > test4.sqlsed 's/^DELETE FROM/INSERT INTO/' test4.sql > test5.sqlsed ':a;N;$!ba;s/\nWHERE\n  / VALUES \(/g' test5.sql > test6.sqlsed 's/@[0-9]*=//g' test6.sql > test7.sqlsed 's/$/,/g' test7.sql > test8.sqlsed 's/VALUES (,/VALUES (/g' test8.sql > test9.sqlsed ':a;N;$!ba;s/,\nINSERT/\);\nINSERT/g' test9.sql > test10.sqlsed '$ s/.$/);/' test10.sql > test11.sqlsed ':a;N;$!ba;s/,\n/,/g' test11.sql > test12.sql。ba;s/,\n/,/g' test11.sql > test12.sql。

        通过 python3 的 re。

import redef binlog转换sqllog(input_file, output_file): with open(input_file, 'r', encoding='utf-8') as f: lines = f.readlines() # 第一步:提取以 ### 开头的行 lines = [line for line in lines if line.startswith('### ')] # 第二步:去掉行首的 ### lines = [line.replace('### ', '', 1) for line in lines] # 第三步:去掉行中的 / 开头的部分 lines = [re.sub(r'/.*', '', line) for line in lines] # 第四步:将 DELETE FROM 替换为 INSERT INTO lines = [line.replace('DELETE FROM', 'INSERT INTO') for line in lines] # 第五步:将换行后的 WHERE 替换为 VALUES ( text = ''.join(lines) text = re.sub(r'\nWHERE', ' VALUES (', text) # 第六步:删除 @n= 格式 text = re.sub(r'@[0-9]+=','', text) # 第七步:在每行末尾添加逗号 lines = text.splitlines() lines = [line + ',' if not line.endswith(',') else line for line in lines] # 第八步:将 VALUES (, 替换为 VALUES ( text = '\n'.join(lines) text = text.replace('VALUES (,', 'VALUES (') # 第九步:替换换换行逗号 ); 换行 INSERT text = re.sub(r',\nINSERT', ');\nINSERT', text) # 第十步:用文件的最终字符代替文件的最终字符 ); if text.endswith(','): text = text[:-1] + ');' with open(output_file, 'w', encoding='utf-8') as f: f.write(text)input_file = 'test1.sql' # 删除binlog日志output_原始导出file = 'test11.sql' # sqlbinlog转换sqllog(input_file, output_file)。

        最后得到 test11.sql 返回数据insert即可。

        最后得到 test11.sql 重新返回数据insert

5、执行sql恢复。

        将上述修复sql重新执行到数据库󿀌可完全恢复到修改前的状态。

原创内容 禁止未经许可转载。原创内容 禁止未经许可转载。原创内容 禁止未经许可转载。

[责任编辑:百度一下]
检察日报数字报 | 正义网 |
Copyrights©最高人民检察院 All Rights Reserved.