记一次MySQL数据表误操作修复

记一次MySQL数据表误操作修复

背景

同事在通过SQL直接修改数据库记录时,误更新了表中的所有数据

sql 复制代码
update t_1 set prop1=1, prop2=2;

联系了数据库的同事,表示直接使用BinLog回滚风险比较大,有可能整个库的数据都会出问题。

恢复方式及前提条件

计划恢复方式

介于数据库同事的"恐吓",我们考虑根据BinLog查询出修改前的原值,进行手动恢复。

前提条件

是否开启了BinLog

sql 复制代码
# 值为 ON,说明已开启
SHOW VARIABLES LIKE 'log_bin';

确认BinLog的格式为ROW

sql 复制代码
# 值为 ROW,则可以日志里看到旧数据
SHOW VARIABLES LIKE 'binlog_format';

找到原数据

找到BinLog并导出为SQL日志

BinLog 文件默认在 /var/lib/mysql/目录下

sql 复制代码
SHOW VARIABLES LIKE 'log_bin_basename';
bash 复制代码
cd /var/lib/mysql
# 查询 mysql-bin.xxxx 文件的时间
ls -l 
# 根据误操作的大概时间确定 BinLog 文件范围
# 使用 mysqlbinlog 命令将 BinLog 导出为SQL日志
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -v /var/lib/mysql/mysql-bin.00000X > temp_log.sql
# 如果 BinLog 日志很大,时间跨度很长,可以增加 --start-datetime,--stop-datetime 参数来限定时间范围
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -v \
--start-datetime="2025-12-30 15:25:00" \
--stop-datetime="2025-12-30 15:35:00" \
/var/lib/mysql/mysql-bin.00000X > temp_log.sql

解读旧数据

在 temp_log.sql 文件中查询更新语句,比如 UPDATE db1.tab1

比如在 vi 中

bash 复制代码
/UPDATE \`db1\`\.\`tab1\`

注意 ### WHERE 和 ### SET 之间的部分,那是修改前的数据:

text 复制代码
# at 123456
#251230 15:30:01 server id 1  end_log_pos 123567 CRC32 0x12345678     UPDATE mydb.xxx
### UPDATE mydb.xxx
### WHERE
###   @1=1            // 这是修改前的主键ID
###   @2='旧值A'       // 这是修改前 col1 的旧值(你想要找的数据)
###   @3='旧值B'       // 这是修改前 col2 的旧值
### SET
###   @1=1
###   @2='111'        // 这是修改后的新值
###   @3='222'
# at 123567

@1, @2... 代表表中的第 1 列、第 2 列。

WHERE 部分记录的是更新前的快照,这就是你要找回的数据。

相关推荐
云贝贝贝6 小时前
腾讯云 TDSQL(MySQL 版)运维高频 6 坑:代理路由、读写分离、分片键、监控、PITR
运维·mysql·腾讯云
山岚的运维笔记10 小时前
mysql 专业笔记 -- 第 8 章:使用变量
运维·数据库·笔记·后端·学习·mysql·dba
JavaPub-rodert14 小时前
Redis 和 MySQL 如何保证数据一致性?从业务方案到底层原理完整讲解
数据库·redis·mysql
笑梦无境15 小时前
mysql的安装及配置(3)
数据库·mysql·adb
Gent_倪16 小时前
MySQL分库、分表、分区详解
数据库·mysql
Wang's Blog16 小时前
Vibe Coding一人即团队系列54:云服务器 Node.js 与 MySQL 9 环境搭建及配置指南
服务器·人工智能·mysql·node.js
数智启示录17 小时前
Apache Kafka 幂等 Producer 的边界:Exactly-Once 到了 MySQL 为什么失效 【Kafka合集】
数据库·经验分享·分布式·mysql·面试·kafka·apache
—Miss. Z—17 小时前
计算机三级数据库技术—填空题
数据库·mysql
Gent_倪19 小时前
MySQL 与 Hive 语法异同点详解
数据库·hive·mysql
老周聊架构19 小时前
Flink 连接器与生态:Kafka Offset 提交修复与 MySQL Binlog 延迟指标
mysql·flink·kafka