小伙伴们有没有在操作undo表空间、Flashback管理,时间保留设置,总有些配置需要提前预置好,否则闪回查询和表的时候出现报错。
需短期恢复(秒级~小时)直接上UNDO_RETENTION同时启用RETENTION GUARANTEE,Undo为Flashback Query/Table提供基础,时间短。
需全天候整库回退直接启用Flashback Database并设定DB_FLASHBACK_RETENTION_TARGET。通过独立存储实现强时间保证,需要大空间。
一、核心机制对比与联系
1. Undo机制
- 作用:存储数据修改前镜像(Before Image),支撑事务回滚、读一致性(MVCC)及闪回查询
- 存储位置:专用Undo表空间,按回滚段组织。
- 生命周期:
- 事务提交后数据保留时长由UNDO_RETENTION控制(默认900秒)
- 空间不足时未过期数据可能被覆盖(除非启用RETENTION GUARANTEE)
- 数据覆盖逻辑:
-- 查看Undo保留策略
SELECT tablespace_name, retention FROM dba_tablespaces WHERE contents = 'UNDO';
2. Flashback机制分类
类型 |
依赖组件 |
恢复粒度 |
时间窗口限制 |
Flashback Query |
Undo表空间 |
行级 |
UNDO_RETENTION(默认15分钟) |
Flashback Table |
Undo表空间 |
表级 |
同上 |
Flashback Drop |
回收站(Recycle Bin) |
表及关联对象 |
表空间空间压力决定 |
Flashback Database |
Flashback Logs |
数据库级 |
DB_FLASHBACK_RETENTION_TARGET (默认24小时) |
Flashback Data Archive |
独立归档区 |
表级(长期) |
用户自定义(可达数年) |
3. 核心联系
- Undo是Flashback的基础:Flashback Query/Table直接读取Undo中的前镜像数据恢复历史状态
- 回收站是Flashback Drop的载体:被删除对象重命名后暂存于回收站,空间不足时自动清理
- Flashback Database依赖独立日志:使用Flashback Logs记录块变化,与Undo分离
二、GUARANTEE时间核心区别概览
特性 |
Undo保留时间 |
Flashback保留时间 |
定义 |
已提交事务的Undo数据保留最短时间 |
闪回功能可恢复的历史时间范围 |
目的 |
保障读一致性和事务回滚 |
支持数据库/表/查询的闪回操作 |
参数 |
UNDO_RETENTION(秒) |
DB_FLASHBACK_RETENTION_TARGET(分钟) |
存储 |
Undo表空间 |
闪回日志(Flashback Logs) |
依赖 |
所有DML操作自动生成 |
需要显式启用闪回数据库功能 |
单位 |
秒 |
分钟 |
1. Undo保留时间机制
- 数据生命周期:
- Active → Unexpired(保留期内)→ Expired(可覆盖)
- 关键特性:
- 最小保证:非强制保留(除非RETENTION GUARANTEE)
- 自动调整:AUM模式下动态计算TUNED_UNDORETENTION
2. Flashback保留时间机制
- 核心组件:
- 闪回缓冲区(SGA内存)
- RVWR进程(Recovery Writer)
- 闪回恢复区(Flash Recovery Area)
3. 时间窗口关系
- 关键约束:闪回查询最大时间范围 ≤ Undo实际保留时间闪回数据库最大时间范围 ≤ Flashback保留时间
三、UNDO记录和flashback日志管理区别与关联
1. 功能边界
Undo机制是事务级数据安全的基础,闪回技术依赖Undo并扩展为运维级恢复工具,两者协同保障Oracle的高可用性
维度 |
Undo记录管理 |
闪回日志管理 |
核心目的 |
支持事务回滚、读一致性、MVCC |
实现整库/表级快速恢复(误操作回滚) |
存储机制 |
存于Undo表空间,逻辑记录数据前镜像 |
存于闪回恢复区,物理记录块变化 |
生命周期控制 |
UNDO_RETENTION + 状态机(ACTIVE/UNEXPIRED/EXPIRED) |
DB_FLASHBACK_RETENTION_TARGET 时间阈值 |
空间重用 |
EXPIRED状态自动覆盖 |
超时后自动删除 |
2. 存储对比
特性 |
Undo存储 |
Flashback存储 |
数据结构 |
行级前镜像 |
数据块级变化 |
写入频率 |
每次DML操作 |
每3秒或块变化时 |
存储位置 |
Undo表空间 |
闪回恢复区 |
空间回收 |
事务级自动回收 |
基于保留策略自动清理 |
四、配置与监控实战
1. 配置命令对比,Undo保留时间验证
-- Undo保留配置(动态)-- 1小时
ALTER SYSTEM SET UNDO_RETENTION = 3600;
System altered.
-- Flashback保留配置(需重启)1440=24小时
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=1440 SCOPE=SPFILE;
ALTER DATABASE FLASHBACK ON;
-- 查看Undo配置及使用情况
SELECT tablespace_name, status, retention FROM dba_tablespaces WHERE contents = 'UNDO';
SELECT begin_time, end_time, tuned_undoretention FROM v$undostat;
--举例
SYS@CDB$ROOT> SELECT tablespace_name, status, retention FROM dba_tablespaces WHERE contents = 'UNDO';
TABLESPACE_NAME STATUS RETENTION
__________________ _________ ______________
UNDOTBS1 ONLINE NOGUARANTEE
SYS@CDB$ROOT> SELECT begin_time, end_time, tuned_undoretention FROM v$undostat;
BEGIN_TIME END_TIME TUNED_UNDORETENTION
_____________ ____________ ______________________
23-JUN-25 23-JUN-25 3600
23-JUN-25 23-JUN-25 1207
22-JUN-25 22-JUN-25 900
22-JUN-25 22-JUN-25 900
139 rows selected.
2. 监控脚本
-- Undo实际保留时间监测
SELECT
TO_CHAR(BEGIN_TIME, 'YYYY-MM-DD HH24:MI') AS SNAPSHOT_TIME,
TUNED_UNDORETENTION AS ACTUAL_RETENTION_SEC
FROM V$UNDOSTAT
ORDER BY BEGIN_TIME DESC
FETCH FIRST 24 ROWS ONLY;
--23ai
SNAPSHOT_TIME ACTUAL_RETENTION_SEC
___________________ _______________________
2025-06-23 06:27 900
24 rows selected.
-- Flashback时间窗口检测
SELECT
OLDEST_FLASHBACK_SCN,
OLDEST_FLASHBACK_TIME,
(SYSDATE - OLDEST_FLASHBACK_TIME)*24 * 60 AS ACTUAL_RETENTION_MIN
FROM V$FLASHBACK_DATABASE_LOG;
--23ai
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TIME ACTUAL_RETENTION_MIN
_______________________ ________________________ ____________________________________________
5420833 21-JUN-25 2158.716666666666666666666666666666666672
3. 关联性验证实验
-- 步骤1:设置不同保留时间
ALTER SYSTEM SET UNDO_RETENTION = 600; -- 10分钟
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=30; -- 30分钟
--System altered.
-- 步骤2:创建测试表
CREATE TABLE flash_test AS SELECT * FROM all_objects;
-- 步骤3:记录时间点
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SELECT SYSDATE AS START_TIME FROM DUAL;
--
START_TIME
______________________
2025-06-23 14:15:17
-- 步骤4:执行数据变更(延迟15分钟)
BEGIN
DBMS_LOCK.SLEEP(900); -- 等待15分钟
DELETE FROM flash_test;
COMMIT;
END;
/
-- 步骤5:测试闪回能力
-- 尝试10分钟前闪回查询(应成功)
SELECT COUNT(*) FROM flash_test AS OF TIMESTAMP SYSDATE - INTERVAL '10' MINUTE;
--
COUNT(*)
___________
0
-- 尝试20分钟前闪回查询(可能失败)
SELECT COUNT(*) FROM flash_test AS OF TIMESTAMP SYSDATE - INTERVAL '20' MINUTE;
-- 预期错误: ORA-01555
-- 尝试闪回数据库到15分钟前(应成功)
SHUTDOWN IMMEDIATE
STARTUP MOUNT
FLASHBACK DATABASE TO TIMESTAMP SYSDATE - INTERVAL '15' MINUTE;
ALTER DATABASE OPEN RESETLOGS;
4. 技术验证脚本
4.1. Flashback Query恢复误删数据
-- 场景:恢复10分钟前误删除的数据
CREATE TABLE fbtest_emp (id NUMBER, name VARCHAR2(50));
INSERT INTO fbtest_emp VALUES (1, 'flashback_USER');
COMMIT;
-- 模拟误删除(10分钟后)
DELETE FROM fbtest_emp;
COMMIT;
--或者模拟删除后等待900s也就是15分钟
BEGIN
DBMS_LOCK.SLEEP(900);
DELETE FROM fbtest_emp;
COMMIT;
END;
/
-- 闪回查询恢复
INSERT INTO fbtest_emp
SELECT * FROM fbtest_emp
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE);
4.2. Flashback Table恢复误更新表
-- 启用行移动
ALTER TABLE fbtest_emp ENABLE ROW MOVEMENT;
-- 闪回至5分钟前状态
FLASHBACK TABLE fbtest_emp TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE);
4.3 Flashback Drop恢复误删表
-- 删除表并恢复
DROP TABLE fbtest_emp;
SHOW RECYCLEBIN; -- 查看回收站对象
FLASHBACK TABLE fbtest_emp TO BEFORE DROP;
4.4. Flashback Database全库回滚
-- 需提前启用Flashback Database
ALTER DATABASE FLASHBACK ON;
-- 回退至1小时前
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
FLASHBACK DATABASE TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);
ALTER DATABASE OPEN RESETLOGS;
场景 |
推荐技术 |
原因 |
单行数据误改/误删 |
Flashback Query |
无需停机,基于Undo快速恢复 |
整表误操作(Update/Delete) |
Flashback Table |
依赖Undo,恢复表至指定时间点 |
表误删除 |
Flashback Drop |
通过回收站直接还原,无需备份 |
全库逻辑错误(如批量误删) |
Flashback Database |
分钟级回退,比RMAN PITR更快 |
长期审计追溯(>7天) |
Flashback Data Archive |
独立存储突破Undo时间限制 |
- - Flashback Query/Table受限于UNDO_RETENTION,超时后失效 。
- - Flashback Database不支持介质故障恢复(需RMAN)。
- - 回收站对象在表空间空间不足时自动清除
5. 故障处理矩阵
现象 |
相关保留时间 |
解决方案 |
ORA-01555 |
Undo保留不足 |
增加UNDO_RETENTION或表空间 |
ORA-00600 [3020] |
Flashback保留不足 |
增大DB_FLASHBACK_RETENTION_TARGET |
闪回查询范围不足 |
Undo保留 |
延长Undo保留期+保证模式 |
闪回数据库失败 |
FB保留 |
增加保留时间或缩短恢复点 |
六、使用体验
- Undo是基石:支撑事务回滚、读一致性和短期闪回,但受限于空间和保留策略。
- Flashback是扩展:
- 短期恢复(Query/Table)依赖Undo;
- 对象级恢复(Drop)依赖回收站;
- 长期追溯(FDA)需独立归档区