【找回mysql被删除数据】

1、查看 binlog 是否开启

navicat中执行下面语句

show variables like 'log_bin';

  • ON:已开启,可以回查;
  • OFF:没开启,MySQL 层面无法看到删数据 SQL,只能从应用日志排查。

2、查看 binlog 文件列表

show binary logs;

3、把删除数据的日志输出到文本文件中

进入到mysql的bin目录下,打开命令行,如果不知道bin目录在哪里可以执行如下语句查询bin目录位置

SHOW VARIABLES LIKE 'basedir';

不知道mysql数据文件地址可以执行下面语句查询

SHOW VARIABLES LIKE 'datadir';

在mysql的bin目录下打开命令行执行如下语句,把删除数据日志输出到文本文件D:\del_011.txt中

"mysql的bin地址 \mysqlbinlog.exe" -v --base64-output=decode-rows --start-datetime="开始时间 " --stop-datetime="结束时间 " "mysql数据文件地址\binlog文件列表中的Log_name " | findstr /i "### DELETE FROM" > D:\del_011.txt

举例说明,mysql的bin目录地址为:

D:\Program Files\MySQL\MySQL Server 8.0\bin

mysql的数据文件地址为:

D:\ProgramData\MySQL\MySQL Server 8.0\Data

查询到的binlog文件列表中的Log_name为:

WIN-E75A7J5SUVB-bin.000105

查询2026-08-21 11:00:00到2026-08-21 12:30:59的日志,在命令行里执行如下语句:

"D:\Program Files\MySQL\MySQL Server 8.0\bin\mysqlbinlog.exe" -v --base64-output=decode-rows --start-datetime="2026-08-21 11:00:00" --stop-datetime="2026-08-21 12:30:59" "D:\ProgramData\MySQL\MySQL Server 8.0\Data\WIN-E75A7J5SUVB-bin.000105" | findstr /i "### DELETE FROM" > D:\del_011.txt

4、打开生成的文本文件,找到删除信息利用python脚本生成insert,sql语句

生成的文本如下

python脚本如下

python 复制代码
import re

# 把你的全部binlog日志粘贴到这里
binlog_text = """
### DELETE FROM `nrid_db`.`yst_ex`
### WHERE
###   @1=29627
###   @2='727c2af1-1abb-4ad7-84a1-e68c9f36281e'
###   @3=NULL
###   @4='08:15'
###   @5='08:35'
###   @6=20
###   @7=''
###   @8='模具清理'
###   @9='第一组模具清理'
###   @10=''
###   @11=''
###   @12=''
###   @13=''
###   @14=NULL
###   @15=NULL
###   @16=NULL
###   @17=NULL
###   @18=NULL
###   @19=NULL
###   @20=NULL
###   @21=NULL
###   @22=NULL
###   @23=NULL
###   @24=NULL
###   @25=NULL
###   @26=NULL
###   @27=NULL
###   @28=NULL
###   @29='280B FR D/C/肋条'
###   @30=5
###   @31=1
###   @32='白班'
###   @33='CM4'
###   @34=NULL
###   @35='842,819'
###   @36='2026-08-16 11:10:50'
###   @37='2026-08-16 11:10:50'
###   @38=0
###   @39=NULL
###   @40=NULL
### DELETE FROM `nrid_db`.`yst_ex`
### WHERE
###   @1=29628
###   @2='e9b1c67e-0b2b-49db-a4db-23fbef97854d'
###   @3=NULL
###   @4='08:41'
###   @5='08:51'
###   @6=10
###   @7=''
###   @8='模具清理'
###   @9='cm6粘砂'
###   @10=''
###   @11=''
###   @12=''
###   @13=''
###   @14=NULL
###   @15=NULL
###   @16=NULL
###   @17=NULL
###   @18=NULL
###   @19=NULL
###   @20=NULL
###   @21=NULL
###   @22=NULL
###   @23=NULL
###   @24=NULL
###   @25=NULL
###   @26=NULL
###   @27=NULL
###   @28=NULL
###   @29='280B FR D/C/肋条'
###   @30=5
###   @31=1
###   @32='白班'
###   @33='CM6'
###   @34=NULL
###   @35='842,819'
###   @36='2026-08-16 11:11:50'
###   @37='2026-08-16 11:11:50'
###   @38=0
###   @39=NULL
###   @40=NULL
# --------把你剩下全部binlog粘贴到此,不要修改代码---------
"""

def binlog_delete_to_insert(text: str):
    # 匹配每一组DELETE块:捕获 @1=xxx ... @40=xxx
    pattern = re.compile(r"### DELETE FROM `nrid_db`.`yst_ex`\s*### WHERE\s*((?:###\s+@\d+=.*?\n)+)", re.S)
    blocks = pattern.findall(text)
    inserts = []
    for blk in blocks:
        lines = blk.splitlines()
        row = {}
        for line in lines:
            m = re.search(r"@(\d+)=(.*)", line)
            if not m:
                continue
            idx = int(m.group(1))
            val = m.group(2).strip()
            row[idx] = val
        # 按1~40顺序取出值
        vals = []
        for i in range(1, 41):
            vals.append(row[i])
        val_str = ", ".join(vals)
        sql = f"INSERT INTO `nrid_db`.`yst_ex` VALUES({val_str});"
        inserts.append(sql)
    return "\n".join(inserts)


if __name__ == "__main__":
    out_sql = binlog_delete_to_insert(binlog_text)
    print(out_sql)
    # 输出到文件
    with open("restore_yst_ex.sql", "w", encoding="utf-8") as f:
        f.write(out_sql)

绿色###部分替换为日志中删除数据的部分,也就是想要找回的部分

注意这句话for i in range(1, 41)中的41是数据表字段个数加1,如果表中字段有64个要把41改成65:for i in range(1, 65)。这样控制台会打出插入数据的sql语句,执行语句,数据找回成功啦,哈哈哈哈

ps:python是用vscode执行的

相关推荐
Awna1 小时前
MySQL 存储空间与索引运维实战:从空间排查到在线扩容
android·运维·mysql
__zRainy__1 小时前
Node系列 · ORM:Sequelize 模型
数据库·后端·node.js
whcyhhh1 小时前
头歌实践教学平台:数据科学与大数据技术导论(五)
大数据·数据库·python
大鹏说大话1 小时前
用 Python 与 DeviceAtlas 构建自动化设备数据库
数据库·python·自动化
肠畔码农1 小时前
深度解密 Redis 核心引擎:从 MULTI/EXEC 事务机制到 EVAL 脚本的原子性演进
数据库·redis·junit
lailai04102 小时前
定制化企业网盘与标准化方案
数据库
PHP实战开发录2 小时前
AI接口结构化输出解析异常排查记录
数据库·安全·ai·php·开发
JAVA面经实录9172 小时前
MySQL问题定位与性能优化完整知识体系
java·jvm·数据库·mysql·性能优化
JL152 小时前
如何用 MySQL 持久化、历史快照与游标实现多步 Redo/Undo
前端·数据库·mysql