29-Oracle 23ai Flashback Log Placement(闪回日志灵活配置)

小伙伴们有没有被各种存储路径满导致的业务崩,半夜起来清理的经历。一不小心 FRA写满了,导致了实例hang住。

OCM考试,时不时就会冒出来这个直接给instance hang,本就卡的环境中脑袋都卡壳、无从下手,一脸懵直接崩。

23ai flashback Log Placement解耦存储依赖,重构性能瓶颈,释放灵活性

一、Flashback发展演进

1. 之前的闪回日志的固定保存路径

在Oracle 23ai之前的版本(19c/12c/11g等),闪回日志(Flashback Logs)存在强耦合设计:

  • 存储位置强制绑定FRA:闪回日志必须存储在DB_RECOVERY_FILE_DEST定义的FRA路径中
  • 空间竞争风险:FRA同时存储归档日志、RMAN备份等,空间不足时自动清理最早闪回日志,导致保留周期不稳定
  • FRA的存储空间的I/O速度决定了Log的写入速度
2. Oracle 23ai的架构革新:Flashback Log Placement

23ai通过存储解耦与写入优化重构闪回架构:

  • 独立存储路径:新增参数DB_FLASHBACK_LOG_DEST,支持自定义闪回日志存储位置(ASM/文件系统)
  • 空间隔离控制:新增参数DB_FLASHBACK_LOG_DEST_SIZE设置独立空间配额(默认0,需显式配置)
bash 复制代码
-- ASM磁盘组和文件路径
ALTER SYSTEM SET DB_FLASHBACK_LOG_DEST='+DATA_FRA' scope=SPFILE;

ALTER SYSTEM SET DB_FLASHBACK_LOG_DEST='/opt/oracle/FB_FRA' scope=SPFILE;

ALTER SYSTEM SET DB_FLASHBACK_LOG_DEST_SIZE=100G;

二、新特性技术解析:参数与操作

​1. 核心参数说明 可以单独设置独立的存储

1、可以设置到更快的磁盘中,比如SSD

2、降低FRA的压力

3、提高FLASHBACK单独存储空间和FRA的性能。

4、三个参数可以动态设置,RAC环境中所有的节点都要一致,且在CDB$ROOT中设置

|-------------------------------|-----------------|-------------------|
| ​参数名称​ | ​作用​ | ​各种限制 |
| DB_FLASHBACK_LOG_DEST | 指定闪回日志独立存储路径 | RAC所有实例需相同 |
| DB_FLASHBACK_LOG_DEST_SIZE | 设置闪回日志空间硬限制(字节) | 必须 >0 且早于_DEST设置 |
| DB_FLASHBACK_RETENTION_TARGET | 定义闪回可以保留的时间 | 默认1440,需要按需设置 |

3. 查询视图

bash 复制代码
-- 闪回日志存储状态
-- 路径、空间使用率
SYS@CDB$ROOT> SELECT * FROM v$flashback_log_dest;

NAME       SPACE_LIMIT    SPACE_USED    NUMBER_OF_FILES    CON_ID
_______ ______________ _____________ __________________ _________
                     0                                0         0

-- 闪回窗口有效性  -- 可恢复的最早SCN
SELECT oldest_flashback_scn, retention_target FROM v$flashback_database_log;

-- 性能指标 
SELECT * FROM v$flashback_database_stat;
SYS@CDB$ROOT> SELECT * FROM v$flashback_database_stat;

BEGIN_TIME    END_TIME        FLASHBACK_DATA    DB_DATA    REDO_DATA    ESTIMATED_FLASHBACK_SIZE    CON_ID
_____________ ____________ _________________ __________ ____________ ___________________________ _________
13-JUN-25     13-JUN-25              4038656    2383872      3918848                           0         0

三、23ai 闪回日志独立存储配置脚本​​

bash 复制代码
-- 1. 关闭闪回日志(需MOUNT状态)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE FLASHBACK OFF;  -- 关闭闪回

-- 2. 配置独立存储路径与空间
ALTER SYSTEM SET DB_FLASHBACK_LOG_DEST_SIZE=100G SCOPE=SPFILE;
ALTER SYSTEM SET DB_FLASHBACK_LOG_DEST='+DATA_FRA' SCOPE=SPFILE;

-- 3. 重新启用闪回
ALTER DATABASE FLASHBACK ON;  -- 开启闪回
ALTER DATABASE OPEN;

-----
--检查参数
SYS@CDB$ROOT> show parameter flashback;
NAME                          TYPE        VALUE
----------------------------- ----------- -----
db_flashback_log_dest         string
db_flashback_log_dest_size    big integer 0
db_flashback_retention_target integer     1440
-- 步骤1:启用归档模式(必需前提)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;          -- 必须为归档模式
ALTER DATABASE OPEN;
--实操记录
SYS@CDB$ROOT> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@CDB$ROOT> STARTUP MOUNT;
ORACLE instance started.
Total System Global Area   1603287928 bytes
Fixed Size                    4922232 bytes
Variable Size               872415232 bytes
Database Buffers            721420288 bytes
Redo Buffers                  4530176 bytes
Database mounted.
SYS@CDB$ROOT> ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ARCHIVELOG
SYS@CDB$ROOT> alter database open;

Database altered.

SYS@CDB$ROOT> SELECT LOG_MODE FROM V$DATABASE;

LOG_MODE
_____________
ARCHIVELOG

SYS@CDB$ROOT>
--
SYS@CDB$ROOT> alter system set db_recovery_file_dest_size=50G scope=SPFILE;
System altered.
SYS@CDB$ROOT> alter system set db_recovery_file_dest='/opt/oracle/DB_FRA' scope=SPFILE;
System altered.
-- 步骤2:关闭闪回并配置独立存储(必须按顺序执行)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE FLASHBACK OFF;       -- 先关闭闪回
--SYS@CDB$ROOT> STARTUP MOUNT;
ORACLE instance started.

Total System Global Area   1603287928 bytes
Fixed Size                    4922232 bytes
Variable Size               620756992 bytes
Database Buffers            973078528 bytes
Redo Buffers                  4530176 bytes
Database mounted.
SYS@CDB$ROOT> ALTER DATABASE FLASHBACK OFF;
Database altered.
--
-- 必须先设置_SIZE
ALTER SYSTEM SET DB_FLASHBACK_LOG_DEST_SIZE=100G SCOPE=SPFILE;
-- 支持ASM/文件系统
ALTER SYSTEM SET DB_FLASHBACK_LOG_DEST='+DATA_FRA' SCOPE=SPFILE;
ALTER SYSTEM SET DB_FLASHBACK_LOG_DEST='/opt/oracle/FB_FRA' SCOPE=SPFILE;
-- 重新启用闪回
ALTER DATABASE FLASHBACK ON;
SYS@CDB$ROOT> alter database flashback on;
Database altered.

ALTER DATABASE OPEN;
SYS@CDB$ROOT> ALTER DATABASE OPEN;

Database altered.
-- 步骤3:验证配置
-- **23ai新增视图
SYS@CDB$ROOT> desc v$flashback_database_log;

Name                        Null?    Type
___________________________ ________ _________
OLDEST_FLASHBACK_SCN                 NUMBER
OLDEST_FLASHBACK_TIME                DATE
RETENTION_TARGET                     NUMBER
FLASHBACK_SIZE                       NUMBER
ESTIMATED_FLASHBACK_SIZE             NUMBER
CON_ID                               NUMBER
SYS@CDB$ROOT>

SELECT * FROM v$flashback_database_log;
SYS@CDB$ROOT> SELECT * FROM v$flashback_database_log;

   OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TIME       RETENTION_TARGET    FLASHBACK_SIZE    ESTIMATED_FLASHBACK_SIZE    CON_ID
_______________________ ________________________ ___________________ _________________ ___________________________ _________
                3294212 13-JUN-25                               1440         419430400                           0         0
-- 确认闪回状态和归档模式
SELECT flashback_on, log_mode FROM v$database;
SYS@CDB$ROOT> SELECT flashback_on, log_mode FROM v$database;

FLASHBACK_ON    LOG_MODE
_______________ _____________
YES             ARCHIVELOG
SYS@CDB$ROOT> show parameter db_flashback;
NAME                          TYPE        VALUE
----------------------------- ----------- ------------------
db_flashback_log_dest         string      /opt/oracle/FB_FRA
db_flashback_log_dest_size    big integer 100G
db_flashback_retention_target integer     1440
SYS@CDB$ROOT>

四、关键约束点

设置flashback DEST和开启flashback之前必须开启归档(这个大家都知道了),

1、参数设置顺序强制约束​,

    • 必须 **先设置 DB_FLASHBACK_LOG_DEST_SIZE** 再设置 DB_FLASHBACK_LOG_DEST,否则报错。空间配额是路径生效的前提条件
  • 必须先设定db_recovery_file_dest_size和db_recovery_file_dest
bash 复制代码
ORA-02097: parameter cannot be modified because specified value is invalid

ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
ORA-38709: Recovery Area is not enabled.

2、RAC环境特殊要求​

bash 复制代码
-- RAC中所有实例配置必须一致
ALTER SYSTEM SET DB_FLASHBACK_LOG_DEST_SIZE=100G SCOPE=SPFILE SID='*';
ALTER SYSTEM SET DB_FLASHBACK_LOG_DEST='+DATA_FRA' SCOPE=SPFILE SID='*';

3、空间计算公式​所需空间=日均数据变化量×保留天数×1.5

  • 计算示例:日增量50GB × 7天保留期 × 1.5 = 525GB

五、与从前设置的差异

技术本质​:从 ​​"FRA附属日志"​​ 到 ​​"一级恢复基础设施"​​ 的定位跃迁

|---------|--------------|------------------|
| ​参数 | ​19c及之前版本​ | ​Oracle 23ai​ |
| ​存储路径​ | 强制使用FRA | 独立路径(ASM/文件系统/云) |
| ​空间管理​ | 与归档日志竞争,可能占满 | 专用配额,严格保留策略 |
| ​高可用影响​ | FRA满导致数据库挂起 | 独立存储,故障隔离 |
| ​多路径支持​ | 不支持 | 本地+云多路径自动负载均衡 |
| ​RAC配置​ | 实例级参数可不同 | 所有实例必须相同 |

相关推荐
小陈工4 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花8 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸8 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain8 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希9 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神9 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员9 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java9 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿9 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴9 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存