Oracle 10g 引入的 Flashback 功能讓資料庫管理員能輕鬆實現時間點恢復,但其底層運作機制中的 Flashback Buffer 配置往往被忽視。本文將透過實際啟動日誌與動態效能視圖,深入探討 Flashback Buffer 在 Shared Pool 中的記憶體分配行為,並測試 LOG_BUFFER 參數對其大小的影響。
觀察資料庫啟動日誌,可明確看到 Flashback Generation Buffer 在 Shared Pool 中的初始分配大小:
Wed Dec 30 15:20:40 2009 Allocated 3981204 bytes in shared pool for Flashback generation buffer Starting background process RVWR RVWR started with pid=16, OS id=724
這表明預設情況下約分配 3.8 MB 給 Flashback Buffer。
查詢動態效能視圖同樣可獲得該數值:
SQL> select name, bytes from V$sgastat 2 where pool='shared pool' 3 and name like '%Flash%'; NAME BYTES ----------------------------- --------- Flashback generation buff 3981204
當 Flashback Buffer 空間不足時,系統會出現 Flashback buf free by RVWR 等待事件。可惜 Oracle 未提供直接參數調整 Flashback Buffer 大小,對於高吞吐、高併發系統,預設大小往往無法滿足需求。
嘗試將 LOG_BUFFER 從 7MB 增加至 10MB 並重啟資料庫,觀察 Flashback Buffer 是否跟著變化:
SQL> show parameter log_buffer NAME TYPE VALUE ------------ ------- --------- log_buffer integer 7012352 SQL> alter system set log_buffer=10000000 scope=spfile; System altered. SQL> startup force Oracle instance started. Total System Global Area 536870912 bytes ... Redo Buffers 11317248 bytes SQL> select name, bytes from V$sgastat 2 where pool='shared pool' 3 and name like '%Flash%'; NAME BYTES ----------------------------- --------- Flashback generation buff 3981204
結果顯示:Flashback Buffer 大小維持 3981204 bytes 不變。 這證實 LOG_BUFFER 並不直接控制 Flashback Buffer 配置。
由於顯性參數無效,下一步需深入探討與 Flashback 相關的隱含參數(如 _flashback_generation_buffer_size 等),並結合 RVWR 進程運作機制進行更細緻的調優研究。