【找回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执行的

相关推荐
何中应3 分钟前
MySQL 连接驱动单独下载的两种方式
数据库·mysql·maven
余槐i11 分钟前
开虚拟线程后接口反而更慢:JDK 21 synchronized 锁住载体线程的排查
java·spring boot·redis·mysql·性能优化
csdn_aspnet20 分钟前
.NETCore EF Core 根据 mysql 数据表按顺序生成简单编号
mysql·.net core·efcore·1024程序员节·sequence·编号
合尘猫1 小时前
AI客服国标落地一个月:从工程角度看,真正要改的是三处数据结构
数据库·人工智能·架构
惊讶的猫2 小时前
mysql索引
mysql·1024程序员节
Maynor9962 小时前
免费 Cloudflare 只有 10 个 D1?满了之后的「穷鬼打法」:表前缀复用同一个库
数据库·后端·云计算·cloudflare
csdn_aspnet2 小时前
.NETCore SqlSuagr 根据 mysql 数据表按顺序生成简单编号
mysql·.netcore·sqlsugar·1024程序员节·sequence·.net8·编号
冰暮流星2 小时前
mysql之索引设计的原则
数据库·mysql·1024程序员节
昵称画10 小时前
交接班记录电子化:三班之间的信息不漏
开发语言·数据库·人工智能·低代码·php
缓慢更新11 小时前
审批的加签与会签:多人意见怎么合
android·java·数据库·低代码·rxjava