记录一次生产MySQL数据的恢复

引言

⚠前提是在数据删除前,需要开启binlog,并且是raw格式的
image.png

ℹ清楚当时的操作时间
⚠执行的 DELETE 语句

找到binlog文件

这里可以通过my.cnf或者my.ini来确定binlog保存的路径,可以通过文件创建时间来简单的判断,也可以通过mysqlbinlog来判断
image.png

查找相应时间段数据

mysqlbinlog --base64-output=DECODE-ROWS --verbose --start-datetime="2024-11-27 12:00:00" --stop-datetime="2024-11-27 12:05:00" .\mysql-bin.000647 如果存在数据输出,那么就说明你找对binlog了,接下来就需要导出成SQL文件了。

mysqlbinlog --base64-output=DECODE-ROWS --verbose --start-datetime="2024-11-27 12:00:00" --stop-datetime="2024-11-27 12:05:00" .\mysql-bin.000647 > recovery.sql

image.png

转换SQL

因为那里全部都是delete,接下来需要转换成INSERT,这里可以简单的使用一下脚本来处理下,先把delete那部分文本提取出来,保存到一个新的文件中。

sql = """INSERT INTO `xxxxxx`.`xxxxxx`(`xxcode`,`xxil`)VALUES"""
with open(r"g:/recovery2.txt", 'r') as f:
    fff = f.read()
    split = fff.split("### DELETE FROM `xxxxxx`.`xxxxxx`")
    for i in split:
        if i == '':
            continue
        rid = i.split("\n")[2].split("=")[1] -- 暂不需要
        rname = i.split("\n")[3].split("=")[1]
        rmail = i.split("\n")[4].split("=")[1]
        sql += f"({rname},{rmail}),"
print(sql[:-1])

因为涉及到一些敏感数据,这里就打码了。

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。