Oracle Flashback 技术全解

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/