跳转到主要内容

Native Flashback

Native Flashback 允许使用 AS OF TIMESTAMP 查询保留的 InnoDB 历史数据。AliSQL 会定期记录快照,并利用保留的 Undo 构建一致的历史读视图。

它适合故障排查和定向恢复,不能替代备份、Binlog、恢复演练或灾难恢复流程。

关键参数

控制项8.0.44-2 默认值作用
innodb_rds_flashback_enabledON允许 AS OF TIMESTAMP 查询
innodb_rds_flashback_task_enabledOFF控制后台快照任务
innodb_undo_retention0设置 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 UPDATELOCK IN SHARE MODE
  • 可能改变主键可见性的 DDL 会导致旧快照不兼容;不能保证所有 DDL 前后的历史查询均可用。
  • Undo 保留是目标值,不是无条件保证。空间限制和工作负载压力可能缩短实际窗口。
  • 保留更多 Undo 会消耗存储,并可能增加 Purge 压力。
  • innodb_rds_flashback_task_stop_all=ON 会暂停快照创建和历史清理。

相关变量

变量默认值作用
innodb_rds_flashback_interval1快照生成间隔
innodb_rds_flashback_allow_gap30 分钟请求时间与选中快照之间允许的最大差值
innodb_rds_flashback_print_warningON选中快照不精确时发出警告
innodb_undo_space_supremum_size10240 MiB清理保留历史时使用的 Undo 空间上限
innodb_undo_space_reserved_size0 MiB预留 Undo 空间阈值

参考来源