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. 最佳实践
- 关键表启用 FDA:长期历史
- 生产启用 Flashback Database:快速恢复
- 合理设置 undo_retention:1-24 小时
- 关键表 ENABLE ROW MOVEMENT:支持 Flashback Table
- 监控 FRA 空间:避免耗尽
- 定期演练 Flashback:验证可用性
- 回收站定期清理:节省空间
- 不要依赖 Flashback 替代备份:仅辅助
- DDL 操作前备份:Flashback 不能跨越 DDL
- 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/