mysql binlog 回滚

------------------------------------------------------------------------------------

先教你两步:查 binlog 是否开启 + 查看你这条 update 的原始记录,一步一步来。

 

1. 查看 MySQL 是否开启 binlog

 
登录 MySQL 执行:
 
sql
 
 
show variables like 'log_bin';
 
 
  • 结果为 ON → 已开启(可以回滚)
  • 结果为 OFF → 没开启(这条 update 无法恢复)
 
顺便查看 binlog 模式(必须是 ROW 才能回滚):
 
sql
 
 
show variables like 'binlog_format';
 
 
必须是:ROW
 

 

2. 查看 binlog 文件和位置

 
sql
 
 
show master logs;
show variables like 'datadir';
show variables like 'log_bin_basename';
 
 

 

3. 查看你这条 update user set name='xxx' where id=1 的 binlog 记录

 
假设 binlog 文件是 mysql-bin.000001,在 /var/lib/mysql/ 下:
 
bash
 
运行
 
 
 
 
mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/mysql-bin.000001 | grep -A 10 -B 10 "UPDATE"
 
 
或者按时间过滤(更精准):
 
bash
 
运行
 
 
 
 
mysqlbinlog -v --base64-output=decode-rows \
--start-datetime="2026-04-10 00:00:00" \
--stop-datetime="2026-04-10 23:59:59" \
/var/lib/mysql/mysql-bin.000001 \
| grep -A 15 -B 5 "user"
 
 

你会看到类似结构(ROW 模式下):

 
plaintext
 
 
### UPDATE `test`.`user`
### WHERE
###   @1=1  (id)
###   @2='原来的值'  (name 修改前)
### SET
###   @2='被改错的值'  (name 修改后)
 
 
  • @2=' 原来的值' 就是你要回滚的内容
  • 直接拼成:
    sql
     
     
    update user set name='原来的值' where id=1;
    
     
     
 

 

4. 重要提醒

 
  • 如果 log_bin = OFF:这条 update 永久无法回滚
  • 如果 binlog_format = STATEMENT:看不到旧值,也无法回滚
  • 只有 log_bin=ON + binlog_format=ROW 才能恢复数据
 

 
把下面三条命令的结果发给我,我可以直接帮你定位并生成回滚 SQL:
 
sql
 
 
show variables like 'log_bin';
show variables like 'binlog_format';
show master logs;


mysql 主从数据库如何恢复单个执行的update语句回滚、
我给你讲最实用、生产环境真正能用的 MySQL 单条 update 误更新 → 回滚恢复 方法,不用停库、不用复杂操作。

一句话结论

已经执行提交的 update 没有直接 undo,必须用 binlog 反向生成回滚 SQL

一、前提(必须满足)

  1. binlog 必须开启(默认生产都开)
  2. binlog 格式必须是 ROW 模式(必须!否则无法回滚)
  3. 你大概知道误操作时间或位置

二、最快恢复方法(生产标准)

工具:binlog2sql

(Python 小工具,专门用来从 binlog 生成 回滚 SQL)

三、我直接给你 1 分钟恢复步骤

1. 安装 binlog2sql(服务器上执行)

bash
 
运行
 
 
 
 
yum install -y git python3 python3-pip
git clone https://github.com/danfengcao/binlog2sql.git
cd binlog2sql
pip3 install -r requirements.txt
 

2. 找到你误操作的那个 binlog 文件

sql
 
 
show master logs;
show binlog events in 'mysql-bin.000XXX';
 

3. 生成 回滚 SQL(关键命令)

bash
 
运行
 
 
 
 
python3 binlog2sql.py \
-h 127.0.0.1 -u root -p'密码' \
-d 库名 -t 表名 \
--start-file mysql-bin.000XXX \
--start-datetime='2025-01-01 12:00:00' \
--stop-datetime='2025-01-01 12:01:00' \
--sqltype update \
--flashback
 

输出结果

直接生成反向 update 回滚语句!比如你误执行:
sql
 
 
update user set name='aaa' where id=1;
 
工具会生成:
sql
 
 
update user set name='原来的值' where id=1;
 

4. 把回滚 SQL 执行一遍 → 数据恢复完成!


四、如果没有工具(应急手工方法)

1. 从 binlog 查看误操作的具体内容

bash
 
运行
 
 
 
 
mysqlbinlog -v --base64-output=decode-rows mysql-bin.000XXX
 

2. 找到:

  • 旧值(before)
  • 新值(after)

3. 手动写 update 把旧值改回去

sql
 
 
update 表 set 字段=旧值 where 主键=XXX;
 

五、最关键的 3 个知识点(你一定要懂)

1. update 一旦提交,无法直接回滚

MySQL 不像 SQL Server 有界面 undo,必须靠 binlog 恢复。

2. 必须 ROW 模式 binlog

只有 ROW 模式会记录:
  • 修改前的值
  • 修改后的值
     
    才能回滚。

3. 越早恢复越好

别再往这张表写入数据,否则覆盖后无法恢复。

六、我给你最安全的生产建议

  1. 所有 update 必须先 begin 事务,确认没问题再 commit
sql
 
 
begin;
update ...;
# 检查
commit;  或  rollback;
 
  1. 生产必须开启 ROW 模式 binlog
  2. 误更新第一时间用 binlog2sql 回滚

七、你现在需要我帮你做什么?

你告诉我 3 个信息,我直接帮你生成恢复命令:
  1. 误操作的 库名、表名
  2. 大概 时间
  3. binlog 文件名(show master logs;
我可以直接给你生成可执行的回滚语句,10 秒恢复数据。

------------------------------------------------------------------------------------

三、如果你误更新了 8201 ~ 最大 ID 所有数据

 
执行这条批量恢复:
 
sql
 
 
UPDATE zygcbusiness.task_info_bak2026
SET title = REPLACE(title, '1', '')
WHERE id > 8200 AND title LIKE '%1';
 
 

 

四、如果你想 用 binlog 完整回滚整个误操作(专业方案)

 

1. 找到你误操作的 binlog 位置

 
sql
 
 
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000XXX | grep -A 20 "task_info_bak2026"
 
 

2. 回滚到误操作之前

 
bash
 
运行
 
 
 
 
mysqlbinlog --stop-position="你的位置" mysql-bin.000XXX | mysql -uroot -p

------------------------------------------------------------------------------------

如何查看慢sql

MySQL 查看慢 SQL 最实用方法(直接照做)

下面分 开启慢查询、查看慢日志、分析慢 SQL 三步,全是可直接复制的命令。

一、先看当前慢查询是否开启

sql
 
 
show variables like '%slow_query_log%';
show variables like '%long_query_time%';
show variables like '%slow_query_log_file%';
 
  • slow_query_log = ON 才会记录
  • long_query_time:执行超过多少秒算慢 SQL(默认 10 秒,一般改 1 或 2)
  • slow_query_log_file:慢日志文件路径

二、临时开启慢查询(重启 MySQL 失效)

sql
 
 
set global slow_query_log = 1;
set global long_query_time = 1;    # 超过1秒就算慢SQL
set global log_queries_not_using_indexes = 1;  # 没走索引也记录
 
立即生效,不需要重启。

三、永久开启(修改配置文件 my.cnf/my.ini)

在 [mysqld] 下加:
ini
 
 
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
log_output = FILE
 
重启 MySQL 生效。

四、直接查看慢 SQL 日志

bash
 
运行
 
 
 
 
cat /var/lib/mysql/slow.log
 
或者实时看:
bash
 
运行
 
 
 
 
tail -f /var/lib/mysql/slow.log
 

五、用 mysqldumpslow 工具分析(最常用)

bash
 
运行
 
 
 
 
# 按执行次数排序
mysqldumpslow -s c /var/lib/mysql/slow.log

# 按执行时间排序
mysqldumpslow -s t /var/lib/mysql/slow.log

# 只看前10条
mysqldumpslow -s t -t 10 /var/lib/mysql/slow.log
 

六、Navicat 里查看慢 SQL

  1. 打开 Navicat → 点击顶部 工具 → 服务器监控 → MySQL
  2. 切换到 慢查询日志 标签
  3. 可以直接看到慢 SQL、执行时间、次数

七、一句话看懂慢日志

一条慢 SQL 长这样:
plaintext
 
 
# Time: 2026-04-10
# User@Host: root[root] @ localhost []
# Query_time: 2.123456  Lock_time: 0.000123 Rows_sent: 1000  Rows_examined: 100000
SET timestamp=123456789;
select * from big_table where name = 'xxx';
 
  • Query_time: 2.12:执行了 2.12 秒
  • Rows_examined: 100000:扫描 10 万行,典型没走索引

------------------------------------------------------------------------------------

我给你整理 MySQL 最实用、生产环境真正在用的 3 款 binlog 恢复 / 回滚工具,直接告诉你哪个最好用、怎么用、什么时候用,全部是误 update 恢复必备工具。

 

一、生产首选工具(最简单、最稳)

 

1. binlog2sql(推荐 99% 场景)

 
能做:
 
  • 自动生成 回滚 SQL(update/delete/insert 都能回滚)
  • 按时间、按库、按表过滤
  • 直接生成可执行的 undo 语句
 
优点:
 
  • 不用停库
  • 不用解析复杂日志
  • 误 update 一键回滚
 

 

2. MyFlash(美团开源,速度极快)

 
能做:
 
  • 直接反向生成回滚语句
  • 性能比 binlog2sql 更快
 
优点:
 
  • 二进制工具,不用 Python
  • 大日志处理更快
 

 

3. mysqlbinlog(MySQL 官方自带)

 
能做:
 
  • 查看 binlog
  • 基于位置 / 时间点恢复
 
缺点:
 
  • 不能自动回滚
  • 要手动拼 SQL
 

 

二、你现在最需要:binlog2sql(最佳选择)

 
我直接给你 一键安装 + 一键回滚 命令。
 

安装(1 分钟)

 
bash
 
运行
 
 
 
 
yum install -y git python3 python3-pip
git clone https://github.com/danfengcao/binlog2sql.git
cd binlog2sql
pip3 install -r requirements.txt
 
 

回滚单个 update 命令(直接用)

 
bash
 
运行
 
 
 
 
python3 binlog2sql.py \
-h 127.0.0.1 \
-u root \
-p'你的MySQL密码' \
-P 3306 \
-d 库名 \
-t 表名 \
--start-file mysql-bin.000XXX \
--start-datetime "2026-04-11 09:00:00" \
--stop-datetime "2026-04-11 09:10:00" \
--sqltype UPDATE \
--flashback
 
 

输出

 
直接生成 回滚 update 语句,执行即可恢复!
 

 

三、工具对比(你一看就懂)

 
表格
 
工具难度是否自动回滚生产推荐度
binlog2sql 简单 ✅ 是 ⭐⭐⭐⭐⭐
MyFlash 中等 ✅ 是 ⭐⭐⭐⭐
mysqlbinlog ❌ 否 ⭐⭐
 

结论:

 
误 update 恢复 → 直接用 binlog2sql,最简单、最安全、最通用!
 

 

四、我可以直接帮你恢复

 
你只要发给我 3 条信息:
 
  1. show master status;
  2. 误操作时间(例如 2026-04-11 09:05)
  3. 库名 + 表名
 
我直接给你生成可执行的回滚命令,10 秒恢复数据。

------------------------------------------------------------------------------------

------------------------------------------------------------------------------------

posted @ 2026-04-10 10:38  hanease  阅读(18)  评论(0)    收藏  举报