Oracle Flashback Table 详解
Oracle Flashback Table 详解
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Flashback Table 是表级时间点回退功能[1]:
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 Drop | DROP | 回收站 |
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. 最佳实践
- 启用 ROW MOVEMENT:关键表
- Undo 充足:保留时间
- 测试:演练
- 权限:受控
- 审计:变更追踪
- DDL 谨慎:破坏 Flashback
- 比较:Flashback Query
- 监控:Undo 使用
- 备份:兜底
- 文档:操作记录
11. 参考资料
[1] Oracle Database Backup and Recovery User’s Guide 19c, “Flashback Table” https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/