记一次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 部分记录的是更新前的快照,这就是你要找回的数据。

相关推荐
随风飘的云1 天前
mysql的innodb引擎对可重复读做了那些优化,可以避免幻读
mysql
于眠牧北4 天前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
Turnip12026 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
加号37 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏7 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
WeiXin_DZbishe7 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
爱可生开源社区7 天前
MySQL 性能优化:真正重要的变量
数据库·mysql
小马爱打代码7 天前
MySQL性能优化核心:InnoDB Buffer Pool 详解
数据库·mysql·性能优化
风流 少年7 天前
mysql mcp
数据库·mysql·adb
西门吹雪分身7 天前
mysql之数据离线迁移
数据库·mysql