小伙伴們有沒有被各種存儲路徑滿導致的業務崩,半夜起來清理的經歷。一不小心 FRA寫滿了,導致了實例hang住。
OCM考試,時不時就會冒出來這個直接給instance hang,本就卡的環境中腦袋都卡殼、無從下手,一臉懵直接崩。
23ai flashback Log Placement解耦存儲依賴,重構性能瓶頸,釋放靈活性
一、Flashback發展演進
?1. 之前的閃回日志的固定保存路徑
- ?存儲位置強制綁定FRA?:閃回日志必須存儲在DB_RECOVERY_FILE_DEST定義的FRA路徑中
- ?空間競爭風險?:FRA同時存儲歸檔日志、RMAN備份等,空間不足時自動清理最早閃回日志,導致保留周期不穩定
- FRA的存儲空間的I/O速度決定了Log的寫入速度
2. Oracle 23ai的架構革新:Flashback Log Placement?
- ?獨立存儲路徑?:新增參數DB_FLASHBACK_LOG_DEST,支持自定義閃回日志存儲位置(ASM/文件系統)
- ?空間隔離控制?:新增參數DB_FLASHBACK_LOG_DEST_SIZE設置獨立空間配額(默認0,需顯式配置)
-- 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. 查詢視圖
-- 閃回日志存儲狀態
-- 路徑、空間使用率
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 閃回日志獨立存儲配置腳本???
-- 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
_____________
ARCHIVELOGSYS@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
ORA-02097: parameter cannot be modified because specified value is invalidORA-38706: Cannot turn on FLASHBACK DATABASE logging.
ORA-38709: Recovery Area is not enabled.
?2、RAC環境特殊要求?
-- 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='*';
- 計算示例:日增量50GB × 7天保留期 × 1.5 = ?525GB
五、與從前設置的差異
技術本質?:從 ??“FRA附屬日志”?? 到 ??“一級恢復基礎設施”?? 的定位躍遷
?參數 | ?19c及之前版本? | ?Oracle 23ai? |
?存儲路徑? | 強制使用FRA | 獨立路徑(ASM/文件系統/云) |
?空間管理? | 與歸檔日志競爭,可能占滿 | 專用配額,嚴格保留策略 |
?高可用影響? | FRA滿導致數據庫掛起 | 獨立存儲,故障隔離 |
?多路徑支持? | 不支持 | 本地+云多路徑自動負載均衡 |
?RAC配置? | 實例級參數可不同 | 所有實例必須相同 |