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")
相关推荐
廿一夏5 小时前
MySql存储引擎与索引
数据库·sql·mysql
lzhdim7 小时前
SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题
数据库·sql
瀚高PG实验室8 小时前
瀚高企业版V9.1.1在pg_restore还原备份文件时提示extract函数语法问题
数据库·瀚高数据库
TDengine (老段)8 小时前
TDengine Tag 设计哲学与 Schema 变更机制
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
敲个大西瓜8 小时前
Java项目常用数据归档方式
mysql
YOU OU9 小时前
Spring IoC&DI
java·数据库·spring
Muscleheng10 小时前
Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
数据库·postgresql
kyriewen10 小时前
面试官让我查各部门工资最高的员工,我用AI三秒写出窗口函数,他愣了
后端·mysql·面试
小码工作室10 小时前
使用 HAVING 进行 MySQL 集合筛选
mysql
罗超驿11 小时前
18.事务的隔离性和隔离级别:MySQL面试高频考点全解析
数据库·mysql·面试