mysql通过binlog恢复数据

原文地址

一、查看是否开启binlog

是否开启

sql 复制代码
SHOW VARIABLES LIKE 'log_bin';

开启的模式

sql 复制代码
SHOW VARIABLES LIKE 'binlog_format';

查看当前使用的哪个文件

sql 复制代码
show master status

查看所有

我们通过文件的最后修改时间,可以看出binlog覆盖的时间范围。一般后缀的数字越大,表示越新。

sql 复制代码
show master logs

查看保存位置

sql 复制代码
SHOW VARIABLES LIKE 'log_bin_basename';

查看内容分析

shell 复制代码
mysqlbinlog --base64-output=decode-rows -v --start-datetime="2024-09-12 11:59:00" --stop-datetime="2024-09-12 12:01:00" mysql-bin.000213 > binlog.sql

二、删除命令恢复python脚本

自己改下脚本的表什么的

py 复制代码
import re


if __name__ == '__main__':

    # 读取文件
    with open(r'D:\pythonTools\Models\test.txt', 'r', encoding='utf-8') as f:
        content = f.read()

    # 分割每条 DELETE 记录
    blocks = content.split('DELETE FROM `dhgx_cloud_test`.`sys_user`')[1:]

    inserts = []

    for block in blocks:
        # 提取所有 @N=xxx 行
        matches = re.findall(r'###\s+@(\d+)=(.*)', block)
        if not matches:
            continue

        # 构建字典 {位置: 值}
        values = {}
        for pos, val in matches:
            pos = int(pos)
            val = val.strip()
            if val == 'NULL':
                values[pos] = 'NULL'
            elif val.startswith("'") and val.endswith("'"):
                values[pos] = val  # 保留引号
            else:
                values[pos] = f"'{val}'"  # 非 NULL 且非字符串(如数字)也加引号更安全(MySQL 允许)

        # 确保有26个字段(缺失的设为 NULL)
        row = []
        for i in range(1, 27):
            row.append(values.get(i, 'NULL'))

        sql = f"""INSERT INTO `dhgx_cloud_test`.`sys_user` (
      `user_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`,
      `sex`, `avatar`, `password`, `status`, `del_flag`, `login_ip`, `login_date`,
      `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `version`,
      `custom_id`, `is_ent_admin`, `ent_id`, `ent_name`, `position`, `enti_identity`
    ) VALUES ({', '.join(row)});"""
        inserts.append(sql)

    # 输出到文件
    with open('./recover_sys_user.sql', 'w', encoding='utf-8') as f:
        f.write('\n'.join(inserts))
    print(f"已生成 {len(inserts)} 条 INSERT 语句,保存至 recover_sys_user.sql")
相关推荐
Rain的Java大神之路7 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
十二同学啊8 小时前
向量数据库:从核心原理到 RAG 与 Java 实战
数据库
蓝速科技8 小时前
会议室门牌公告通知发布选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
大海星辰7989 小时前
一次对账SQL“灵异事件”排查:NOT IN返回空集的坑
mysql
Linux-lucky9 小时前
32-38-Linux学习之旅之MySQL综合
linux·运维·学习·mysql·ubuntu
一 乐11 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序
SelectDB11 小时前
同等资源下 Apache Doris 4.2 vs StarRocks 4.1.1:1TB SSB 与 TPC-H 性能实测
大数据·数据库·数据分析
这个DBA有点耶12 小时前
数据库集群与分布式架构:三条技术路线对比、金仓KES RAC实测数据与决策框架
数据库·程序员·架构
MayBaymax12 小时前
MongoDB 索引与事务
java·数据库·mongodb
SelectDB12 小时前
Doris vs ClickHouse:企业 OLAP 走向下一阶段,两种技术路线如何选择
大数据·数据库·数据分析