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")
相关推荐
captain3761 小时前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
小此方2 小时前
Re:Mysql数据库基础篇(八):详细讲解复合查询、多表查询、自连接、多行、多列子查询与合并查询
数据库·mysql
xszivvvv2 小时前
Mariadb数据库frm文件异常,如何恢复数据
数据库·mariadb
smile_life_3 小时前
MySQL 设置 防止账户被暴力破解
数据库·mysql
ShineWinsu3 小时前
对于Qt:QRadioButton常见属性以及QButtonGroup的解析
数据库·c++·qt·microsoft·gui·qradiobutton·qbuttongroup
测试盐3 小时前
oracle数据库卡顿排查
数据库·oracle
滕州市燕猫虎计算机科技工作室个体工商户3 小时前
MySQL、MVCC、多版本并发控制
数据库·mysql·mvcc·数据库事务
明航咨询-陈老师3 小时前
ITSS运行维护服务能力成熟度认证技术纵深:标准模型、等级路径、2026审核趋势与CS/CMMI对比
服务器·数据库·cmmi
缓慢更新4 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
AI小百科4 小时前
向量数据库:AI 的「记忆仓库」是怎么工作的
数据库·人工智能·oracle