帮你快速理解、总结文档立即下载

SQL 闪回

最近更新时间:2026-08-20 15:23:30
我的收藏
本文介绍如何使用 SQL 闪回工具,从 Binlog 中反向生成恢复 SQL,找回被误操作(INSERTUPDATEDELETE)影响的行级数据。

操作场景

当业务误执行 DELETEUPDATEINSERT 等 DML 语句后,需要在不创建新实例、不依赖全量恢复(PITR)的前提下,快速找回被误操作影响的行级数据,可以使用 SQL 闪回工具。
TDSQL Boundless 提供多种数据恢复手段,各自适用场景不同,请根据实际误操作类型选择:
恢复手段
适用场景
局限
SQL 闪回工具
INSERT/DELETE/UPDATE 等 DML 行级误操作
不支持 DDL 误操作(如误 TRUNCATEDROP TABLEALTER TABLE);不支持 XA 事务的反向回放
START TRANSACTION READ ONLY AS OF TIMESTAMP
查询历史时刻的数据快照
只能 SELECT 历史数据,不能直接写回原表
FLASHBACK TABLE ... TO BEFORE DROP
DROP TABLE
只覆盖删表场景,不覆盖 DML 误操作
需要整实例恢复到历史时刻的场景
必须恢复到新实例,耗时长、成本高,差异数据需手工对比提取

工作原理

SQL 闪回工具通过解析 ROW 格式 Binlog 中每条 DML 事件携带的 before-image(变更前值)和 after-image(变更后值),按指定的 Binlog 位置区间逆序遍历事件,反向生成可在原实例上执行的恢复 SQL:
误操作类型
反向生成的恢复语句
说明
INSERT
DELETE
删除误插入的行
DELETE
INSERT
用 before-image 恢复被删除的行
UPDATE
反向 UPDATE
SET 变更前的值,回滚到旧值
工具按位置区间逆序回放事件,因此多次连续修改同一行数据也能正确回滚到误操作发生前的状态。

前提条件

目标实例已开启 Binlog,且格式为 ROW(包含 before-image 和 after-image)。若 Binlog 格式非 ROW,工具无法反向生成恢复 SQL。
已知晓误操作发生的时间范围,能够定位到对应的 Binlog 文件和位置区间。
误操作对应的 Binlog 尚未被清理(purge),仍可访问。
已联系腾讯云技术支持,获取 SQL 闪回工具。
注意:
执行恢复 SQL 会直接修改原表数据。若误操作发生后,原表的相关行已被业务再次修改,执行恢复 SQL 会覆盖业务最新的写入。请在执行前确认恢复范围,避免覆盖有效数据。

使用限制

目标实例必须开启 Binlog 且格式为 ROW,否则无法反向生成恢复 SQL。
不支持 XA 事务的反向回放。若指定的 Binlog 位置区间内包含 XA 事务事件,其反向回放不在本工具的能力范围内。
不支持恢复 DDL 误操作(如误 TRUNCATEDROP TABLEALTER TABLE)。DDL 误操作请参见 库表回收站 或使用 克隆实例
仅按 Binlog 文件 + 位置区间过滤事件,不支持按时间、库、表或 SQL 类型直接过滤。
仅生成 SQL,不直接修改原表数据;若原表当前数据已被业务再次修改,执行恢复 SQL 会覆盖业务最新写入,请自行评估影响后执行。
大区间或大事务(例如误删百万级行)场景下,生成的 SQL 文件可能较大,建议评估单次执行对实例的压力,必要时分批执行。
运行工具所在的主机需能直连目标实例端口,且账号需具备读取 Binlog 与表结构的权限。

操作步骤

步骤一:定位误操作的 Binlog 位置区间

通过 SHOW BINLOG EVENTS 查看 Binlog 事件,或使用 mysqlbinlog 工具解析 Binlog 内容,确定误操作所在的 Binlog 文件名,以及误操作事件的起止位置(start-position / end-position)。
-- 查看指定 Binlog 文件的事件列表,定位误操作对应的 Pos 区间
SHOW BINLOG EVENTS IN 'binlog.000001' FROM 4 LIMIT 20;
说明:
工具按“Binlog 文件 + 位置区间”过滤事件,不支持按时间过滤,也不支持按库、表、SQL 类型直接过滤。若需要精确恢复某张表或某条语句,需要在选定的位置区间内自行界定,或对生成的 SQL 二次筛选。

步骤二:生成恢复 SQL

使用 SQL 闪回工具,指定连接信息、目标 Binlog 文件路径与位置区间,反向生成恢复 SQL:
./mysqlbinlog_flashback_percona_auto \\
--user=<账号> --pass='<密码>' \\
--host=<实例地址> --port=<端口> \\
--start-position=<起始位置> \\
--end-position=<结束位置> \\
--output-only=1 \\
--ignoreddl=1 \\
--mode=rollback \\
--output-file=/tmp/flashback.sql \\
<binlog文件路径>
参数
是否必选
说明
--user / --pass / --host / --port
连接目标实例的账号信息,用于获取表结构等元信息
--start-position / --end-position
目标 Binlog 文件内的起止位置区间,界定要回放的事件范围
--mode
恢复模式,当前支持 rollback(生成反向恢复 SQL)
--output-only
取值为1时仅生成 SQL 到文件,不直接执行,建议始终设置为1
--ignoreddl
取值为1时跳过 Binlog 中的 DDL 事件,仅处理 DML
--output-file
恢复 SQL 的输出文件路径
位置参数(Binlog 文件路径)
待反向解析的 Binlog 文件路径

步骤三:审阅恢复 SQL

--output-only=1 模式下,工具仅将恢复 SQL 写入 --output-file 指定的文件,不会直接修改数据库。请在执行前打开该文件,人工审阅生成的 SQL 是否符合预期。
cat /tmp/flashback.sql

步骤四:执行恢复 SQL

确认恢复 SQL 无误后,在原实例上执行该文件:
mysql -h <实例地址> -P <端口> -u <账号> -p <数据库名> < /tmp/flashback.sql

步骤五:校验恢复结果

执行恢复 SQL 后,通过 SELECT 语句查询受影响的行,与误操作发生前的预期数据进行比对,确认恢复结果一致。
SELECT * FROM <表名> WHERE <主键或唯一键条件>;

常见问题

SQL 闪回工具能否恢复被 TRUNCATE DROP TABLE 删除的数据?

不能。SQL 闪回工具仅针对 DML(INSERT/UPDATE/DELETE)误操作的行级恢复,不覆盖 DDL 误操作。误 DROP TABLE 请使用库表回收站;误 TRUNCATEALTER TABLE 等其他 DDL 误操作,需通过全量恢复(PITR)处理。

执行恢复 SQL 后,如果原表数据已被业务再次修改,会发生什么?

执行恢复 SQL 会按照 SQL 内容直接修改当前表数据,若目标行在误操作之后又被业务修改,恢复 SQL 会覆盖业务最新写入的值。请在执行前确认恢复范围是否会影响后续正常业务数据。

相关文档

若需要查询历史时刻的数据快照(不写回原表),请参见 闪回查询START TRANSACTION READ ONLY, AS OF TIMESTAMP <expr>)。
若误操作为 DROP TABLE,请参见 库表回收站FLASHBACK TABLE ... TO BEFORE DROP)。
若需要将实例整体恢复到历史某一时刻,请参见 克隆实例