闪回查询、闪回表、闪回删除、闪回数据库

Oracle 闪回(Flashback)是核心的数据误操作恢复技术,主要分为 闪回查询、闪回表、闪回删除、闪回数据库 四类。下面按场景给出完整配置与操作步骤(以 11g/12c/19c 通用)。


一、基础配置(所有闪回功能依赖)

1. UNDO 表空间与保留时间(闪回查询/闪回表依赖)

-- 查看 undo 配置
show parameter undo;

-- 设置 undo 保留时间(秒,建议 86400=1天)
alter system set undo_retention=86400 scope=both;

-- 确保 undo 表空间足够(建议固定大小/自动扩展)

2. 回收站(闪回删除依赖)

-- 开启回收站(默认 ON)
alter system set recyclebin=ON scope=spfile;

-- 会话级临时开启
alter session set recyclebin=ON;

-- 查看状态
show parameter recyclebin;

3. 归档 + 闪回数据库(仅闪回数据库需要)

-- 1. 检查是否归档
select log_mode,flashback_on from v$database;

-- 2. 开启归档(mount 状态)
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

-- 3. 配置闪回恢复区
alter system set db_recovery_file_dest='+FRA' scope=spfile;       -- 路径
alter system set db_recovery_file_dest_size=50G scope=spfile;     -- 大小
alter system set db_flashback_retention_target=1440 scope=spfile;-- 分钟(1天)

-- 4. 开启闪回数据库(mount 状态)
shutdown immediate;
startup mount;
alter database flashback on;
alter database open;

-- 验证
select flashback_on from v$database;

二、闪回查询(Flashback Query)

用途:查看表过去某时间点/SCN的数据(不修改当前数据)。

1. 按时间戳查询

-- 查看 10 分钟前的数据
select * from emp as of timestamp systimestamp - interval '10' minute;

-- 按指定时间
select * from emp as of timestamp to_timestamp('2026-04-13 10:00:00','yyyy-mm-dd hh24:mi:ss');

2. 按 SCN 查询(更精确)

-- 获取当前 SCN
select current_scn from v$database;

-- 闪回查询
select * from emp as of scn 1234567;

3. 闪回版本查询(查看行多版本)

select versions_startscn, versions_endscn, versions_operation, empno, ename
from emp versions between scn 1234000 and 1234567;

三、闪回表(Flashback Table)

用途:将表回退到历史时间点/SCN(恢复 DML 误操作)。

前提

必须开启 行移动(ROW MOVEMENT)。

步骤

-- 1. 启用行移动(必须)
alter table emp enable row movement;

-- 2. 闪回表到 1 小时前
flashback table emp to timestamp systimestamp - interval '1' hour;

-- 3. 闪回表到指定 SCN
flashback table emp to scn 1234567;

-- 4. 验证
select * from emp;

四、闪回删除(Flashback Drop)

用途:恢复误 DROP 的表(从回收站)。

1. 查看回收站

-- 会话级
show recyclebin;

-- 数据字典
select original_name, object_name, droptime from user_recyclebin;
select * from dba_recyclebin;

2. 恢复表

-- 直接恢复原表名
flashback table emp to before drop;

-- 同名冲突时重命名
flashback table emp to before drop rename to emp_old;

-- 按回收站对象名恢复
flashback table "BIN$xxx==$0" to before drop;

3. 清理回收站

-- 清除单个表
purge table emp;
purge table "BIN$xxx==$0";

-- 清空当前用户回收站
purge recyclebin;

-- 清空所有用户回收站(DBA)
purge dba_recyclebin;

五、闪回数据库(Flashback Database)

用途:整库回退到历史点(整库误操作)。

步骤

-- 1. 数据库必须在 mount 状态
shutdown immediate;
startup mount;

-- 2. 闪回到指定时间
flashback database to timestamp to_timestamp('2026-04-13 09:00:00','yyyy-mm-dd hh24:mi:ss');

-- 或闪回到 SCN
flashback database to scn 1234567;

-- 3. 以 resetlogs 打开
alter database open resetlogs;

六、常用查询与限制

常用查询

-- 查看 undo 保留时间
show parameter undo_retention;

-- 查看闪回保留目标
show parameter db_flashback_retention_target;

-- 查看是否归档/闪回开启
select log_mode, flashback_on from v$database;

-- 查看回收站对象
select * from user_recyclebin;

限制

  • SYS 用户表、SYSTEM 表空间表不支持闪回删除
  • 闪回表不支持 物化视图、高级队列表
  • 闪回数据库需要 归档 + 闪回日志
  • 超过 undo_retention 或闪回区满,历史数据会被覆盖

七、典型误操作恢复流程

  1. 误 DELETE/UPDATE 已提交

    • 闪回查询 确认历史数据
    • 闪回表 恢复(需 enable row movement
  2. 误 DROP 表

    • 查看回收站
    • 闪回删除 恢复
  3. 整库误操作

    • 立即停库,闪回数据库 到故障前
posted @ 2026-04-13 10:59  wuyingchun1987  阅读(60)  评论(0)    收藏  举报