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配置​ | 实例级参数可不同 | 所有实例必须相同 |

相关推荐
曼汐 .6 分钟前
Python实战应用-Python操作MySQL数据库
数据库·mysql
bcxwz6698 分钟前
mysql 创建大写字母的表名失败
数据库·mysql
数据知道9 分钟前
【系统分析师】第5章-基础知识:数据库系统(核心总结)
数据库·数据库系统·系统分析师
Mr_Xuhhh10 分钟前
数据库期末
数据库·oracle
vace cc15 分钟前
sql列中数据通过逗号分割的集合,对其中的值进行全表查重
数据库·sql
虾条_花吹雪1 小时前
5、Spring AI(MCPServer+MCPClient+Ollama)开发环境搭建_第一篇
数据库·人工智能·学习·spring·ai
JH30733 小时前
Java Stream API 在企业开发中的实战心得:高效、优雅的数据处理
java·开发语言·oracle
一 乐7 小时前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
美林数据Tempodata9 小时前
大模型驱动数据分析革新:美林数据智能问数解决方案破局传统 BI 痛点
数据库·人工智能·数据分析·大模型·智能问数
野槐9 小时前
node.js连接mysql写接口(一)
数据库·mysql