MENU

ORACLE 闪回功能学习备忘

January 9, 2026 • 学习

Oracle 闪回技术可将恢复时间从数小时缩短至数分钟。

任何预防措施都无法避免人为失误的发生。Oracle数据库闪回技术是一组独特而丰富的数据恢复解决方案,能够有选择性地高效撤销一个错误的影响,从人为错误中恢复。在采用闪回技术之前,损坏数据库只需数分钟,而要恢复它则需要数小时。有了闪回技术,纠正错误只需要数分钟的时间。此外,从错误中恢复所需的时间与数据库大小无关,这是Oracle 数据库独有的功能。闪回技术支持在所有层面上进行恢复,包括行、事务、表和整个数据库。

闪回功能的前提

打开闪回功能

-- 需要先把数据库切到Mount模式
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER DATABASE ARCHIVELOG
ALTER DATABASE FLASHBACK ON
ALTER DATABASE OPEN

-- 对于多租户PDB,打开数据库操作
SHOW PDBS
ALTER PLUGGABLE DATABASE ALL OPEN;
ALTER PLUGGABLE DATABASE ORCLPDB1 OPEN;


-- 闪回功能状态查询
SELECT flashback_on FROM v$database;

开启表回收站

ALTER SYSTEM SET RECYCLEBIN = ON SCOPE=BOTH;
-- SCOPE 指定操作的配置文件的类型,可以是MEMORY、SPFILE、BOTH。

-- 查看当前回收站配置
SHOW PARAMETER recyclebin;

-- 查看回收站中的对象
SELECT * FROM DBA_RECYCLEBIN;

-- 类似的,用户回收站视图
SELECT * FROM USER_RECYCLEBIN

-- 恢复回收站中的对象
FLASHBACK TABLE table_name TO BEFORE DROP;

-- 清空回收站
PURGE DBA_RECYCLEBIN;
-- 类似的
PURGE RECYCLEBIN;

-- 删除回收站中的特定对象
PURGE TABLE table_name;
  • 特别注意,该功能对 SYS 用户和 SYSTEM 表空间无效。

闪回操作选择与常见场景

闪回查询

核对历史数据,想看看误删前的数据长什么样。或审计需要。

-- 查询 1 小时前的数据
SELECT * FROM schema.表名 AS OF TIMESTAMP (SYSDATE - 1/24);

-- 或者查询两个 SCN 之间的版本变化
SELECT * FROM schema.表名 VERSIONS BETWEEN SCN 1000 AND 2000;

闪回删除

就像 Windows 的回收站功能。当执行 DROP TABLE 时,Oracle 默认会将其重命名放入回收站。

-- 1. 查看回收站里的表(原表名已变更为BIN$开头)
SHOW RECYCLEBIN;
-- 2. 执行闪回(恢复原名)
FLASHBACK TABLE schema.表名 TO BEFORE DROP;
-- 3. 如果有重名冲突,恢复并重命名
FLASHBACK TABLE schema.表名 TO BEFORE DROP RENAME TO 表名_old;

闪回表

针对错误的 DELETE/UPDATE,由于数据库原理原因,需要打开行移动功能。

-- 0. 开启行移动(必须步骤)
ALTER TABLE schema.表名 ENABLE ROW MOVEMENT;

-- 1. 闪回到 10 分钟前
FLASHBACK TABLE schema.表名 TO TIMESTAMP (SYSDATE - 10/1440);

-- 2. 或者闪回到具体的 SCN
FLASHBACK TABLE schema.表名 TO SCN 12345678;

-- 3. 恢复完成后,建议关闭行移动(除非业务需要)
ALTER TABLE schema.表名 DISABLE ROW MOVEMENT;

闪回数据库

针对一些无法挽回的重大错误,需要关闭数据库

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

-- 2. 启动到 Mount 状态(不要 Open)
STARTUP MOUNT;

-- 3. 执行闪回(例如闪回到昨天 10:00)
FLASHBACK DATABASE TO TIMESTAMP TO_DATE('2023-10-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS');

-- 4. 打开数据库(必须使用 resetlogs,这会重置日志序列)
ALTER DATABASE OPEN RESETLOGS;
-- 这是因为闪回后,REDO、UNDO相关日志编号有可能会大于闪回点的日志编号。
-- 不进行该操作可能导致闪回失败(REDO重新生效、或报错拒绝启动)

常见错误

  • ORA-08189:需要启动行移动
  • ORA-38754:需要启用闪回功能

闪回功能的内部实现机制

关键概念澄清:

  • SCN:System Change Number 系统变更号
  • CKPT:CHECK POINT 检查点
  • DBWn:DB Writer 数据库写入进程
  • LGWR:Log Writer 日志写入进程(Redo、Undo)

所有对数据库的变更都会触发记录下不同的SCN,包括一般业务读写、数据库DDL变更、Redo块写满创建新块操作等。在集群环境下,多节点之间的协调也会触发SCN增量。可以这么理解,SCN如实记录了数据库层面所有变更。

CKPT一般包含多个SCN,但CKPT只是触发DBWn将脏数据块做落盘操作。但数据库实际上存储的是数据块 + 日志。为了保证操作可以被安全地撤销,因此,日志的写入需要先于CKPT触发DBWn。

在理清上述数据库写入逻辑之后,不难理解。闪回功能的核心在于SCN。只要确定了SCN编号,就能确定数据库操作在逻辑上的时序。

闪回还原点的区别

有两种闪回还原点,Normal(普通)和Guarantee(保证)。他们启用后都会占用FRA区。FRA区主要存储的是数据变更时的前快照。

根据资料,对于(a->b),(b->c)的变更,可能存储了2份前快照,分别是a和b。从逻辑上来讲,只用存a就行了,但从性能角度,不做判断,直接多存一份b在高并发情况下效率显然更高。

Guarantee点启用后,若FRA区满了,则导致会导致数据库进入挂起不可用的状态。
Normal点启用后,若FRA满了,则该Normal点就会失效

-- 创建一个名为 'BEFORE_UPGRADE' 的普通还原点
CREATE RESTORE POINT BEFORE_UPGRADE;
-- 创建一个名为 'GUARANTEED_BACKUP' 的保证还原点
CREATE RESTORE POINT GUARANTEED_BACKUP GUARANTEE FLASHBACK DATABASE;

-- 查看所有还原点及其类型(是否保证)
SELECT NAME, SCN, TIME, DATABASE_INCARNATION#, GUARANTEE_FLASHBACK_DATABASE 
FROM V$RESTORE_POINT;

-- 删除还原点(如果是保证还原点,删除后其占用的闪回日志会被自动清理)
DROP RESTORE POINT GUARANTEED_BACKUP;

即日起视情况关闭全站评论区,您可以通过关于页面的电邮地址和我取得联系,谢谢

Last Modified: January 12, 2026
Archives QR Code
QR Code for this page
Tipping QR Code