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执行的