Native Flashback
Native Flashback 允许使用 AS OF TIMESTAMP 查询保留的 InnoDB 历史数据。AliSQL 会定期记录快照,并利用保留的 Undo 构建一致的历史读视图。
它适合故障排查和定向恢复,不能替代备份、Binlog、恢复演练或灾难恢复流程。
关键参数
| 控制项 | 8.0.44-2 默认值 | 作用 |
|---|---|---|
innodb_rds_flashback_enabled | ON | 允许 AS OF TIMESTAMP 查询 |
innodb_rds_flashback_task_enabled | OFF | 控制后台快照任务 |
innodb_undo_retention | 0 秒 | 设置 Undo 保留目标 |
查询开关为 ON 并不代表已经有可查询的历史数据。生成快照还需要开启任务,并设置非零的 Undo 保留时间。
启动前配置
后台线程会在启动服务时根据任务开关和保留时间创建。为确保线程正常启动,请在启动前同时配置以下两个值:
[mysqld]
innodb_rds_flashback_task_enabled=ON
innodb_undo_retention=3600
innodb_rds_flashback_interval=1
服务启动后确认实际状态:
SHOW GLOBAL VARIABLES LIKE 'innodb_rds_flashback%';
SHOW GLOBAL VARIABLES LIKE 'innodb_undo_retention';
查询历史视图
SELECT id, status, updated_at
FROM orders AS OF TIMESTAMP DATE_SUB(NOW(), INTERVAL 5 MINUTE)
WHERE customer_id = 1001;
请求时间不必与快照时间完全一致。innodb_rds_flashback_allow_gap 限制两者可接受的差值,开源版本默认允许相差 30 分钟。请求的时间戳超出保留范围时,会返回 ER_SNAPSHOT_OUT_OF_RANGE。
在规划恢复前查看可用窗口:
CALL dbms_admin.analyze_flashback_snapshots();
CALL dbms_admin.show_flashback_snapshots(NOW(), 'DESC', 20);
分析过程会报告最早和最晚的快照时间,以及 InnoDB 的 Undo 空间使用量。查看和删除快照的存储过程要求 SUPER 权限。
恢复到独立表
先将历史数据恢复到独立表,不要直接替换原表:
CREATE TABLE recovered_orders LIKE orders;
INSERT INTO recovered_orders
SELECT *
FROM orders AS OF TIMESTAMP '2026-07-16 10:00:00';
先验证行数和业务约束。执行重命名或替换前,应暂停应用流量;在确认恢复结果前,请以备份名称保留原表。
使用限制
AS OF TIMESTAMP仅支持对 InnoDB 基础表执行SELECT。- 不支持临时表、视图、
FOR UPDATE和LOCK IN SHARE MODE。 - 可能改变主键可见性的 DDL 会导致旧快照不兼容;不能保证所有 DDL 前后的历史查询均可用。
- Undo 保留是目标值,不是无条件保证。空间限制和工作负载压力可能缩短实际窗口。
- 保留更多 Undo 会消耗存储,并可能增加 Purge 压力。
innodb_rds_flashback_task_stop_all=ON会暂停快照创建和历史清理。
相关变量
| 变量 | 默认值 | 作用 |
|---|---|---|
innodb_rds_flashback_interval | 1 秒 | 快照生成间隔 |
innodb_rds_flashback_allow_gap | 30 分钟 | 请求时间与选中快照之间允许的最大差值 |
innodb_rds_flashback_print_warning | ON | 选中快照不精确时发出警告 |
innodb_undo_space_supremum_size | 10240 MiB | 清理保留历史时使用的 Undo 空间上限 |
innodb_undo_space_reserved_size | 0 MiB | 预留 Undo 空间阈值 |
参考来源
- AliSQL Native Flashback 指南
- AliSQL 8.0.44-2 Release Notes
- 阿里云 RDS MySQL Native Flashback — 此链接介绍托管服务;其中的版本和参数策略不一定适用于源码构建。