本文介绍如何使用 SQL 闪回工具,从 Binlog 中反向生成恢复 SQL,找回被误操作(
INSERT、UPDATE、DELETE)影响的行级数据。操作场景
当业务误执行
DELETE、UPDATE、INSERT 等 DML 语句后,需要在不创建新实例、不依赖全量恢复(PITR)的前提下,快速找回被误操作影响的行级数据,可以使用 SQL 闪回工具。TDSQL Boundless 提供多种数据恢复手段,各自适用场景不同,请根据实际误操作类型选择:
恢复手段 | 适用场景 | 局限 |
SQL 闪回工具 | 误 INSERT/DELETE/UPDATE 等 DML 行级误操作 | 不支持 DDL 误操作(如误 TRUNCATE、DROP TABLE、ALTER 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 事务事件,其反向回放不在本工具的能力范围内。
仅按 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 请使用库表回收站;误 TRUNCATE 或 ALTER TABLE 等其他 DDL 误操作,需通过全量恢复(PITR)处理。执行恢复 SQL 后,如果原表数据已被业务再次修改,会发生什么?
执行恢复 SQL 会按照 SQL 内容直接修改当前表数据,若目标行在误操作之后又被业务修改,恢复 SQL 会覆盖业务最新写入的值。请在执行前确认恢复范围是否会影响后续正常业务数据。
相关文档
若需要查询历史时刻的数据快照(不写回原表),请参见 闪回查询(
START TRANSACTION READ ONLY, AS OF TIMESTAMP <expr>)。若误操作为
DROP TABLE,请参见 库表回收站(FLASHBACK TABLE ... TO BEFORE DROP)。若需要将实例整体恢复到历史某一时刻,请参见 克隆实例。