Oracle Flashback Table 详解

Oracle Flashback Table 详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Flashback Table 是表级时间点回退功能[1]:

详细见:Oracle Flashback 技术全集


2. 前提条件

2.1 行迁移

-- 必须启用行迁移
ALTER TABLE employees ENABLE ROW MOVEMENT;

2.2 Undo 数据

- Undo 表空间充足
- undo_retention 配置

2.3 权限

GRANT FLASHBACK ANY TABLE TO scott;

3. Flashback Table

3.1 到时间戳

FLASHBACK TABLE employees TO TIMESTAMP 
  TO_TIMESTAMP('2026-07-21 10:00:00', 'YYYY-MM-DD HH24:MI:SS');

3.2 到 SCN

FLASHBACK TABLE employees TO SCN 1234567;

3.3 到 RESTORE POINT

FLASHBACK TABLE employees TO RESTORE POINT before_change;

3.4 多表

FLASHBACK TABLE employees, departments TO TIMESTAMP ...;

4. 与 Flashback Query

4.1 Flashback Query

-- 查询历史数据
SELECT * FROM employees 
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);

-- 比较
SELECT * FROM employees
MINUS
SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);

4.2 Flashback Versions Query

SELECT versions_xid, versions_starttime, versions_endtime, 
       id, name, salary
FROM employees
VERSIONS BETWEEN TIMESTAMP 
  TO_TIMESTAMP('2026-07-21 09:00:00', 'YYYY-MM-DD HH24:MI:SS')
  AND TO_TIMESTAMP('2026-07-21 11:00:00', 'YYYY-MM-DD HH24:MI:SS')
WHERE id = 100;

4.3 Flashback Transaction Query

SELECT xid, operation, undo_sql
FROM flashback_transaction_query
WHERE xid = HEXTORAW('...');

5. 限制

5.1 表结构

- 不能 DDL 变更后 Flashback
- 列添加/删除/类型变更
- 表重建

5.2 操作限制

- TRUNCATE 不能 Flashback Table
- DROP TABLE 不能 Flashback Table(需 Flashback Drop)
- SHRINK SPACE

5.3 依赖

- 约束
- 触发器
- 索引

6. 应用场景

6.1 误 UPDATE

-- 误操作
UPDATE employees SET salary = 0;
COMMIT;

-- 恢复
FLASHBACK TABLE employees TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE);

6.2 误 DELETE

-- 误删除
DELETE FROM employees WHERE dept_id = 10;
COMMIT;

-- 恢复
FLASHBACK TABLE employees TO TIMESTAMP ...;

6.3 数据比较

-- 当前 vs 1 小时前
SELECT * FROM employees
MINUS
SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);

6.4 审计

-- 谁改了数据
SELECT versions_xid, versions_starttime, versions_operation, id, salary
FROM employees
VERSIONS BETWEEN TIMESTAMP ... AND ...
WHERE id = 100;

7. 与其他 Flashback

7.1 对比

类型范围恢复
Flashback Query查询不改数据
Flashback Table单表改数据
Flashback Database全库大范围
Flashback DropDROP回收站

7.2 选择

- 查询历史:Flashback Query
- 单表恢复:Flashback Table
- 大范围:Flashback Database
- DROP:Flashback Drop

详细见:Oracle Flashback Database 详解


8. 性能

8.1 Undo 依赖

- Undo 数据充足
- undo_retention
- 表空间大小

8.2 行迁移开销

- 启用 ROW MOVEMENT
- 轻微开销
- 必须

8.3 速度

- 比 PITR 快
- 分钟级

9. 常见坑与排错

9.1 ORA-08189

- ROW MOVEMENT 未启用
- ALTER TABLE ... ENABLE ROW MOVEMENT

9.2 ORA-01466

- 数据已超出 Undo 保留
- DDL 变更

9.3 ORA-00600

- 内部错误
- 联系 Oracle Support

10. 最佳实践

  1. 启用 ROW MOVEMENT:关键表
  2. Undo 充足:保留时间
  3. 测试:演练
  4. 权限:受控
  5. 审计:变更追踪
  6. DDL 谨慎:破坏 Flashback
  7. 比较:Flashback Query
  8. 监控:Undo 使用
  9. 备份:兜底
  10. 文档:操作记录

11. 参考资料

[1] Oracle Database Backup and Recovery User’s Guide 19c, “Flashback Table” https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/