Oracle Flashback 技术全解

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


1. 概述

Oracle Flashback 是快速恢复数据的技术[1]:

技术 作用 依赖
Flashback Query 查询历史数据 Undo
Flashback Version Query 查询数据历史版本 Undo
Flashback Transaction Query 查询事务历史 Undo
Flashback Table 恢复表到过去时间 Undo
Flashback Drop 恢复删除的表 Recycle Bin
Flashback Database 恢复整个数据库 Flashback Log

2. Flashback Query

2.1 查询历史数据

-- 查询 10 分钟前的数据
SELECT * FROM employees 
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE);

-- 查询指定时间的数据
SELECT * FROM employees 
AS OF TIMESTAMP TO_TIMESTAMP('2026-07-21 10:00:00', 'YYYY-MM-DD HH24:MI:SS');

-- 基于 SCN
SELECT * FROM employees AS OF SCN 1234567;

2.2 限制

  • 依赖 Undo 数据
  • 受 undo_retention 限制
  • DDL 操作后不可用

3. Flashback Version Query

3.1 查询数据历史版本

-- 查询行版本历史
SELECT 
  versions_xid,
  versions_starttime,
  versions_endtime,
  versions_startscn,
  versions_endscn,
  versions_operation,
  id,
  name,
  salary
FROM employees
VERSIONS BETWEEN TIMESTAMP 
  TO_TIMESTAMP('2026-07-21 10: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 = 1;

-- versions_operation: I=Insert, U=Update, D=Delete

3.2 基于 SCN

SELECT 
  versions_xid,
  versions_startscn,
  versions_endscn,
  versions_operation,
  id, name
FROM employees
VERSIONS BETWEEN SCN 1234567 AND 1234999
WHERE id = 1;

4. Flashback Transaction Query

4.1 查询事务详情

-- 查询事务的 SQL
SELECT 
  xid,
  operation,
  undo_sql,
  start_scn,
  commit_scn,
  logon_user,
  table_name
FROM flashback_transaction_query
WHERE xid = '0002001300000123';

-- 查询特定时间段的事务
SELECT 
  xid,
  operation,
  undo_sql,
  logon_user,
  table_name
FROM flashback_transaction_query
WHERE start_scn BETWEEN 1234567 AND 1234999
  AND table_name = 'EMPLOYEES';

4.2 撤销事务

-- 执行 undo_sql 撤销操作
-- 例如:DELETE 撤销为 INSERT

5. Flashback Table

5.1 启用行移动

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

5.2 恢复表

-- 恢复到 10 分钟前
FLASHBACK TABLE employees TO TIMESTAMP 
  (SYSTIMESTAMP - INTERVAL '10' MINUTE);

-- 恢复到指定时间
FLASHBACK TABLE employees TO TIMESTAMP 
  TO_TIMESTAMP('2026-07-21 10:00:00', 'YYYY-MM-DD HH24:MI:SS');

-- 基于 SCN
FLASHBACK TABLE employees TO SCN 1234567;

-- 恢复多个表
FLASHBACK TABLE employees, departments TO TIMESTAMP 
  (SYSTIMESTAMP - INTERVAL '10' MINUTE);

-- 保留索引、约束、触发器
FLASHBACK TABLE employees TO TIMESTAMP 
  (SYSTIMESTAMP - INTERVAL '10' MINUTE) 
  ENABLE TRIGGERS;

5.3 限制

  • 不能跨越 DDL 操作
  • 不能恢复到结构变化前
  • 需要 ENABLE ROW MOVEMENT

6. Flashback Drop(回收站)

6.1 查看回收站

-- 当前用户回收站
SELECT * FROM user_recyclebin;

-- 所有回收站
SELECT * FROM dba_recyclebin;

-- 简化
SHOW RECYCLEBIN;

6.2 恢复删除的表

-- 恢复(原名)
FLASHBACK TABLE employees TO BEFORE DROP;

-- 恢复(重命名)
FLASHBACK TABLE employees TO BEFORE DROP RENAME TO employees_old;

-- 通过回收站名
FLASHBACK TABLE "BIN$abc123==" TO BEFORE DROP;

6.3 清空回收站

-- 清空当前用户回收站
PURGE RECYCLEBIN;

-- 清空所有用户回收站
PURGE DBA_RECYCLEBIN;

-- 清空特定表空间
PURGE TABLESPACE users;

-- 清空特定用户
PURGE TABLESPACE users USER scott;

6.4 彻底删除(不进回收站)

DROP TABLE employees PURGE;

7. Flashback Database

7.1 配置 Flashback Database

-- 1. 启用归档
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;

-- 2. 设置 Flash Recovery Area
ALTER SYSTEM SET db_recovery_file_dest_size=100G SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest='+FRA' SCOPE=BOTH;

-- 3. 设置 flashback 目标时间
ALTER SYSTEM SET db_flashback_retention_target=1440 SCOPE=BOTH; -- 24 小时

-- 4. 启用 Flashback Database
ALTER DATABASE FLASHBACK ON;

-- 5. 打开数据库
ALTER DATABASE OPEN;

7.2 查看状态

-- 查看是否启用
SELECT flashback_on FROM v$database;

-- 查看 Flashback Log
SELECT 
  oldest_flashback_scn,
  oldest_flashback_time,
  retention_target,
  estimated_flashback_size
FROM v$flashback_database_log;

-- 查看 Flashback 进度
SELECT * FROM v$flashback_database_stat;

7.3 Flashback Database

-- 1. 关闭数据库
SHUTDOWN IMMEDIATE;

-- 2. 启动到 MOUNT
STARTUP MOUNT EXCLUSIVE;

-- 3. Flashback
-- 基于时间
FLASHBACK DATABASE TO TIMESTAMP 
  TO_TIMESTAMP('2026-07-21 10:00:00', 'YYYY-MM-DD HH24:MI:SS');

-- 基于 SCN
FLASHBACK DATABASE TO SCN 1234567;

-- 基于时间戳
FLASHBACK DATABASE TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);

-- 4. 重置日志打开
ALTER DATABASE OPEN RESETLOGS;

7.4 限制

  • 不能跨 RESETLOGS
  • 数据文件离线时不可用
  • 需要 ARCHIVELOG 模式
  • 需要 Flash Recovery Area

8. Flashback Data Archive(FDA)

8.1 创建 FDA

-- 创建表空间
CREATE TABLESPACE fda_ts DATAFILE SIZE 10G;

-- 创建 FDA
CREATE FLASHBACK ARCHIVE DEFAULT fla1 
  TABLESPACE fda_ts 
  QUOTA 10G 
  RETENTION 1 YEAR;

8.2 启用表的 FDA

-- 启用 FDA
ALTER TABLE employees FLASHBACK ARCHIVE fla1;

-- 禁用
ALTER TABLE employees NO FLASHBACK ARCHIVE;

8.3 查询历史

-- 长期历史查询(不受 undo_retention 限制)
SELECT * FROM employees 
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' DAY);

-- 查询 1 年前数据
SELECT * FROM employees 
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '365' DAY);

9. 多租户中的 Flashback

9.1 PDB Flashback

-- 19c+ 支持 PDB Flashback
-- 必须启用 CDB 级 Flashback Database

ALTER PLUGGABLE DATABASE hrpdb CLOSE;
FLASHBACK PLUGGABLE DATABASE hrpdb TO TIMESTAMP 
  TO_TIMESTAMP('2026-07-21 10:00:00', 'YYYY-MM-DD HH24:MI:SS');
ALTER PLUGGABLE DATABASE hrpdb OPEN RESETLOGS;

10. 常见坑与排错

10.1 ORA-08180: 无快照

现象:Flashback Query 失败。

修复:

-- 1. 检查 undo_retention
SHOW PARAMETER undo_retention;

-- 2. 增大 undo_retention
ALTER SYSTEM SET undo_retention=3600 SCOPE=BOTH;

-- 3. 检查 Undo 表空间大小
SELECT tablespace_name, bytes/1024/1024 AS mb 
FROM dba_data_files WHERE tablespace_name LIKE 'UNDO%';

10.2 ORA-08189: 不能 Flashback Table

修复:

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

10.3 ORA-38301: 不能 DDL

现象:对回收站中的表操作失败。

修复:

-- 1. 恢复表
FLASHBACK TABLE "BIN$abc==" TO BEFORE DROP;

-- 2. 或清除
PURGE TABLE "BIN$abc==";

10.4 ORA-38727: Flashback Database 失败

修复:

-- 1. 检查 Flashback 是否启用
SELECT flashback_on FROM v$database;

-- 2. 启用
ALTER DATABASE FLASHBACK ON;

-- 3. 检查 FRA
SHOW PARAMETER db_recovery_file_dest;

10.5 ORA-55602: 无法启用 FDA

修复:

-- 1. 检查表空间
SELECT * FROM dba_tablespaces WHERE tablespace_name='FDA_TS';

-- 2. 检查 FDA
SELECT * FROM dba_flashback_archive;

11. 最佳实践

  1. 关键表启用 FDA:长期历史
  2. 生产启用 Flashback Database:快速恢复
  3. 合理设置 undo_retention:1-24 小时
  4. 关键表 ENABLE ROW MOVEMENT:支持 Flashback Table
  5. 监控 FRA 空间:避免耗尽
  6. 定期演练 Flashback:验证可用性
  7. 回收站定期清理:节省空间
  8. 不要依赖 Flashback 替代备份:仅辅助
  9. DDL 操作前备份:Flashback 不能跨越 DDL
  10. PDB 19c+ 用 Flashback PDB:精细恢复

12. 参考资料

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

[2] Oracle Database Administrator’s Guide 19c, “Flashback Features”
https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/