Oracle Flashback Query 详解
Oracle Flashback Query 详解
适用版本:Oracle Database 9i / 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Flashback Query 查询历史数据[1]:
2. 原理
- 基于 Undo 数据
- 查询过去时间点数据
- 不修改数据
3. AS OF TIMESTAMP
3.1 基本
SELECT * FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);
SELECT * FROM employees
AS OF TIMESTAMP TO_TIMESTAMP('2026-07-21 10:00:00', 'YYYY-MM-DD HH24:MI:SS');
3.2 比较
-- 当前 vs 1 小时前
SELECT e.id, e.name AS new_name, e_old.name AS old_name
FROM employees e,
employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR) e_old
WHERE e.id = e_old.id(+)
AND (e.name != e_old.name OR e_old.name IS NULL);
4. AS OF SCN
SELECT * FROM employees AS OF SCN 1234567;
-- 当前 SCN
SELECT current_scn FROM v$database;
5. DBMS_FLASHBACK
5.1 启用
EXEC DBMS_FLASHBACK.ENABLE_AT_TIME(SYSTIMESTAMP - INTERVAL '1' HOUR);
-- 之后所有查询都是历史
5.2 禁用
EXEC DBMS_FLASHBACK.DISABLE;
5.3 SCN
EXEC DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(1234567);
6. 限制
6.1 DDL
- 不能 DDL
- 不能 DML(除非 ENABLE 后 DISABLE)
6.2 Undo 保留
- 取决于 Undo 保留时间
- undo_retention
- 表空间大小
6.3 视图
- 不能在视图定义中使用
- 子查询可以
7. 应用场景
7.1 误操作恢复
-- 找回误删除数据
INSERT INTO employees
SELECT * FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE id = 100;
7.2 数据对比
SELECT * FROM employees
MINUS
SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);
7.3 审计
SELECT id, salary,
(SELECT salary FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - 1)
WHERE id = e.id) AS old_salary
FROM employees e;
7.4 趋势分析
SELECT name, salary FROM employees AS OF TIMESTAMP ...
UNION ALL
SELECT name, salary FROM employees AS OF TIMESTAMP ...;
8. Undo 管理
8.1 保留
ALTER SYSTEM SET undo_retention = 3600; -- 秒
8.2 表空间
ALTER DATABASE DATAFILE '/u01/undotbs01.dbf' RESIZE 10G;
ALTER TABLESPACE undo_tb1 RETENTION GUARANTEE;
8.3 监控
SELECT tablespace_name, retention
FROM dba_tablespaces WHERE contents = 'UNDO';
SELECT * FROM v$undostat;
9. 性能
9.1 开销
- Undo 查询
- 索引利用
- 一般可接受
9.2 时间限制
- Undo 保留时间
- 太久可能失败
- ORA-01555
10. 常见坑与排错
10.1 ORA-01555
- 快照太旧
- Undo 不足
- 调整 undo_retention
10.2 ORA-08180
- 时间超出 Undo 范围
- 检查保留时间
10.3 ORA-01466
- DDL 后无法查询
- 检查
11. 最佳实践
- Undo 充足:保留时间
- RETENTION GUARANTEE:保证
- 测试:场景
- 审计:变更
- 对比:历史
- 恢复:误操作
- 监控:Undo 使用
- 文档:操作
- 备份:兜底
- 演练:定期
12. 参考资料
[1] Oracle Database SQL Language Reference 19c, “Flashback Query” https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/