Oracle 19c入门学习教程,从入门到精通,Oracle 的闪回技术 — 语法知识点与使用方法详解(19)

Oracle 的闪回技术 --- 语法知识点与使用方法详解


一、环境准备(Oracle 安装与闪回配置)

前提 :Oracle Database 已安装(如第16章所述)。
闪回功能依赖于归档模式和闪回恢复区(Flash Recovery Area, FRA)

1. 确保数据库处于 ARCHIVELOG 模式

sql 复制代码
-- 以 sysdba 登录
sqlplus / as sysdba

-- 检查当前模式
ARCHIVE LOG LIST;

-- 若为 NOARCHIVELOG,需切换(需重启)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

2. 配置闪回恢复区(FRA)

sql 复制代码
-- 查看当前 FRA 设置
SHOW PARAMETER db_recovery_file_dest;

-- 若未设置,配置 FRA(Linux 示例)
ALTER SYSTEM SET db_recovery_file_dest_size = 10G;
ALTER SYSTEM SET db_recovery_file_dest = '/u01/app/oracle/fast_recovery_area' SCOPE=BOTH;

-- Windows 示例路径:'D:\oracle\fast_recovery_area'

3. 启用闪回数据库(Flashback Database)

sql 复制代码
-- 关闭数据库并启动到 MOUNT 状态
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;

-- 启用闪回
ALTER DATABASE FLASHBACK ON;

-- 打开数据库
ALTER DATABASE OPEN;

-- 验证
SELECT flashback_on FROM v$database;  -- 应返回 'YES'

✅ 至此,闪回数据库(Flashback Database) 功能已启用。


二、闪回数据库(Flashback Database)

1. 原理

  • 利用 闪回日志(Flashback Logs) 记录块级前映像。
  • 可将整个数据库快速回退到过去某个 SCN 或时间点。
  • 比 RMAN 不完全恢复更快(无需还原数据文件)。

2. 语法:闪回整个数据库

📌 案例:误操作后回退到 1 小时前
sql 复制代码
-- 步骤1:关闭数据库(必须)
SHUTDOWN IMMEDIATE;

-- 步骤2:启动到 MOUNT 状态
STARTUP MOUNT;

-- 步骤3:执行闪回(基于时间)
FLASHBACK DATABASE TO TIMESTAMP SYSDATE - 1/24;

-- 或基于 SCN
-- FLASHBACK DATABASE TO SCN 1234567;

-- 步骤4:以 RESETLOGS 方式打开(必须)
ALTER DATABASE OPEN RESETLOGS;

⚠️ 注意

  • 闪回后必须 OPEN RESETLOGS
  • 闪回范围受 DB_FLASHBACK_RETENTION_TARGET 限制(默认 1440 分钟 = 24 小时)。

3. 查看闪回保留时间

sql 复制代码
-- 查看当前保留目标(单位:分钟)
SHOW PARAMETER db_flashback_retention_target;

-- 修改为 48 小时(2880 分钟)
ALTER SYSTEM SET db_flashback_retention_target = 2880;

💡 实际保留时间还受 FRA 空间限制,空间不足时旧闪回日志会被自动删除。


三、闪回表(Flashback Table)

1. 原理

  • 利用 UNDO 表空间 中的历史数据。
  • 可将单表回退到过去某个时间点或 SCN。
  • 表必须启用 行移动(ROW MOVEMENT)

2. 语法

sql 复制代码
FLASHBACK TABLE table_name TO [SCN | TIMESTAMP] expr;

3. 启用行移动(必须!)

sql 复制代码
ALTER TABLE employees ENABLE ROW MOVEMENT;

4. 📌 案例:误删数据后恢复表

sql 复制代码
-- 1. 记录当前时间(模拟操作前)
SELECT SYSTIMESTAMP FROM dual;  -- 假设返回 2026-01-18 15:00:00.000

-- 2. 误操作:删除重要数据
DELETE FROM employees WHERE department_id = 10;
COMMIT;

-- 3. 发现错误,闪回表到操作前
FLASHBACK TABLE employees TO TIMESTAMP 
  TO_TIMESTAMP('2026-01-18 14:59:00', 'YYYY-MM-DD HH24:MI:SS');

-- 4. 验证数据恢复
SELECT COUNT(*) FROM employees WHERE department_id = 10;  -- 应回到原数量

✅ 优点:无需停机,其他表仍可访问。


四、闪回丢弃(Flashback Drop)与回收站(Recycle Bin)

1. 原理

  • DROP TABLE 并不立即物理删除,而是重命名放入 回收站(Recycle Bin)
  • 可通过 FLASHBACK DROP 快速恢复。

2. 回收站简介

  • 每个用户有自己的回收站(视图:USER_RECYCLEBIN
  • DBA 可查看所有:DBA_RECYCLEBIN

3. 📌 案例:恢复误删的表

sql 复制代码
-- 1. 删除表
DROP TABLE projects;

-- 2. 查看回收站
SELECT object_name, original_name, droptime 
FROM USER_RECYCLEBIN 
WHERE original_name = 'PROJECTS';

-- 输出示例:BIN$gX234...==$0 | PROJECTS | 2026-01-18:15:05:22

-- 3. 恢复表(两种方式)
-- 方式1:恢复原名
FLASHBACK TABLE projects TO BEFORE DROP;

-- 方式2:恢复并重命名(避免同名冲突)
FLASHBACK TABLE projects TO BEFORE DROP RENAME TO projects_old;

4. 清空回收站

sql 复制代码
-- 清空当前用户回收站
PURGE RECYCLEBIN;

-- 清空整个数据库回收站(DBA)
PURGE DBA_RECYCLEBIN;

-- 删除特定表(彻底)
DROP TABLE projects PURGE;  -- 跳过回收站

五、其他闪回技术

1. 闪回版本查询(Flashback Version Query)

✅ 用途:查看某行在一段时间内的所有历史版本。
📌 案例:追踪 salary 变更记录
sql 复制代码
-- 假设 employee_id = 101 的薪资被多次修改
SELECT 
  versions_starttime,
  versions_endtime,
  versions_xid,
  versions_operation,
  salary
FROM employees
VERSIONS BETWEEN TIMESTAMP 
  MINVALUE AND MAXVALUE
WHERE employee_id = 101
ORDER BY versions_starttime;

字段说明

  • versions_operation:I(Insert)、U(Update)、D(Delete)
  • versions_xid:事务 ID,可用于闪回事务查询

2. 闪回事务查询(Flashback Transaction Query)

✅ 用途:查看某事务的具体 SQL 操作(用于构造反向 SQL)。
📌 案例:根据 XID 查询事务详情
sql 复制代码
-- 从上一步获取 XID,例如 '0A000D004C030000'
SELECT 
  operation,
  undo_sql,
  table_name,
  table_owner
FROM FLASHBACK_TRANSACTION_QUERY
WHERE xid = HEXTORAW('0A000D004C030000');

输出示例

复制代码
operation | undo_sql
----------|-----------------------------------
UPDATE    | update "HR"."EMPLOYEES" set "SALARY" = '5000' where "EMPLOYEE_ID" = '101';

💡 可手动执行 undo_sql 进行精确修复。


3. 闪回数据归档(Flashback Data Archive, FDA)

✅ 用途:长期保留历史数据(超越 UNDO 保留期),满足合规要求。
步骤1:创建闪回归档区(需额外表空间)
sql 复制代码
-- 创建专用表空间(可选但推荐)
CREATE TABLESPACE fda_ts DATAFILE '/u01/oradata/XE/fda01.dbf' SIZE 1G;

-- 创建闪回归档
CREATE FLASHBACK ARCHIVE fda_5_years
TABLESPACE fda_ts
RETENTION 5 YEAR;
步骤2:将表加入 FDA
sql 复制代码
-- 启用行移动(FDA 要求)
ALTER TABLE sales ENABLE ROW MOVEMENT;

-- 关联 FDA
ALTER TABLE sales FLASHBACK ARCHIVE fda_5_years;
步骤3:查询历史数据(即使 UNDO 已过期)
sql 复制代码
-- 查询 1 年前的数据
SELECT * FROM sales 
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' YEAR)
WHERE region = 'North';

⚠️ 权限要求 :用户需有 FLASHBACK ARCHIVE ADMINISTER 系统权限。


六、综合性案例

场景:模拟生产事故并多维度恢复

背景:
  • 开发人员误执行 UPDATE employees SET salary = 0;(未加 WHERE)
  • 需要恢复数据,且审计要求提供变更记录。

步骤1:确认事故时间与影响
sql 复制代码
-- 查看最后正确数据的时间
SELECT MAX(salary) FROM employees;  -- 返回 0,说明全被清零

-- 获取当前 SCN(用于后续恢复参考)
SELECT current_scn FROM v$database;  -- 假设 SCN = 2000500
步骤2:使用闪回版本查询追踪变更
sql 复制代码
-- 找出被修改的记录及旧值
SELECT 
  employee_id,
  salary AS current_salary,
  versions_startscn,
  versions_endscn,
  LAG(salary) OVER (PARTITION BY employee_id ORDER BY versions_startscn) AS old_salary
FROM employees
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE employee_id = 101;
步骤3:方案选择 --- 使用闪回表恢复
sql 复制代码
-- 启用行移动(若未启用)
ALTER TABLE employees ENABLE ROW MOVEMENT;

-- 闪回到事故前(假设事故发生在 15:10,现在是 15:15)
FLASHBACK TABLE employees TO TIMESTAMP 
  TO_TIMESTAMP('2026-01-18 15:09:00', 'YYYY-MM-DD HH24:MI:SS');
步骤4:验证恢复结果
sql 复制代码
SELECT COUNT(*) FROM employees WHERE salary = 0;  -- 应为 0
SELECT AVG(salary) FROM employees;               -- 应回到正常值
步骤5:(可选)使用 FDA 长期保留
sql 复制代码
-- 为防止未来类似问题,启用 FDA
CREATE FLASHBACK ARCHIVE hr_fda TABLESPACE users RETENTION 2 YEAR;
ALTER TABLE employees FLASHBACK ARCHIVE hr_fda;

七、闪回技术对比总结

技术 作用对象 依赖 恢复粒度 是否需停机
闪回数据库 整个数据库 FRA + 闪回日志 时间点/SCN 是(MOUNT 状态)
闪回表 单表 UNDO 表空间 时间点/SCN
闪回丢弃 被 DROP 的表 回收站 表级
闪回版本查询 行历史 UNDO 行级版本
闪回数据归档 长期历史 FDA 表空间 行级(多年)

八、最佳实践建议

  1. 生产库必须启用 ARCHIVELOG + FRA + Flashback Database

  2. 关键表启用 FDA(如财务、订单表)。

  3. 定期监控 FRA 空间

    sql 复制代码
    SELECT * FROM V$RECOVERY_AREA_USAGE;
  4. 不要依赖回收站长期保留:回收站受空间策略影响,重要表应逻辑备份。

  5. 测试闪回流程 :定期演练 FLASHBACK DATABASEFLASHBACK TABLE


通过合理运用 Oracle 闪回技术,可在秒级内恢复误操作,极大提升系统可用性与数据安全性,是现代 Oracle DBA 的核心能力之一。

相关推荐
不光头强2 小时前
kafka学习要点
分布式·学习·kafka
凉、介2 小时前
ACRN Hypervisor 简介
笔记·学习·虚拟化
飞鹰512 小时前
深度学习算子CUDA优化实战:从GEMM到Transformer—Week4学习总结
c++·人工智能·深度学习·学习·transformer
踢足球09292 小时前
寒假打卡:2026-01-31
数据库·sql
是小崔啊2 小时前
PostgreSQL快速入门
数据库·postgresql
顾西爵霞2 小时前
个人学习主页搭建指南:从毛坯房到精装户型
学习·html
xxxmine2 小时前
Redis 持久化详解:RDB、AOF 与混合模式
数据库·redis·缓存
hhhjhl2 小时前
flutter_for_openharmony逆向思维训练app实战+学习日历实现
学习·flutter
yufuu982 小时前
使用Scikit-learn进行机器学习模型评估
jvm·数据库·python