2026年2月27日 星期五

Log File Sync 事件分析

在 Oracle 資料庫進行 commit 的行為就會產生 log file sync 事件,對於一個交易型的系統來說,理解 log file sync 是非常重要的一件事, log file sync 等待時間的長短往往直接決定了交易型系統的整體效能。

log file sync 等待事件指的是 commit 從開始到結束整個過程,流程大致如下 :


user session 執行 commit 指令,此時會通知 LGWR 將 redo buffer 的信息寫入 redo log , LGWR 接收到通知後,開始進行 I/O 寫入的動作,完成後告知 user session 完成整個 commit 的流程。

log file sync 一定會伴隨著 log file parallel write 事件,也就是中間 LGWR 進行 I/O 寫入的過程,當發生 log file sync 的效能問題時,必須與 log file parallel write 等待事件一起分析,因為有可能是 I/O 效能不佳進而增加整個 log file sync 等待時間。

一般 log file sync 等待時間過長有幾種可能 :

  • redo log 切換太頻繁

Redo Log 切換太頻繁往往是影響 log file sync 等待時間的主因,頻繁的 commit 或 rollback ,或是 redo log 的大小與數量不合適都有可能造成 redo log 切換太頻繁。

  • LGWR 的 I/O 性能不佳

I/O 性能不佳也是造成 log file sync 事件拉長的原因之一, LGWR 寫入的速度來不及處理頻繁的 commit 行為,也就是 log file parallel write 的時間過長。

從 AWR Report 看到 log file sync 等待事件時,可以從幾個方向開始分析 :


首先必須檢查資料庫的 alert log ,先確認是否有 redo log 切換太頻繁的問題,如果 alert log 有顯示出大量的 Checkpoint not complete 訊息,那就表示 redo log 因為來不及切換導致等待事件發生 :

如果有這種現象,那就表示 redo log 數量不足,或者是 redo log 大小不合適,那麼只需調整 redo log 數量與大小即可。

若是沒有這個現象,那就表示沒有 redo log 切換太頻繁的問題,此時就很有可能是 I/O 效能的問題,可以檢查 AWR 的 Background Wait Events 是否 log file parallel write 的等待時間過長,或者是從 lgwr 的 trace file 檢查 LGWR 的寫入速度 :

以這個例子來說, LGWR 只有寫入幾 KB 或是幾十 KB 就需要十幾秒甚或至百秒,那就可以確定 I/O 的效能有問題,此時就必須請系統管理員協助處理 I/O 效能的問題。

當發生 log file sync 效能問題時,除了檢查 alert log 、 lgwr trace 之外, DB 層面還可以收集 ASH (dba_hist_active_sess_history 、 wrh$_active_session_history) 資訊 ,作業系統層面可以收集監控資訊如 OSWatcher 、 NMON …等,更進一步可以執行 strace(Linux) 、 truss(AIX) 例如 :

# strace -rfttT -o /tmp/start_trace.out -p <PID_of_ LGWR process>

透過 strace 可掌握 I/O 行為實際停滯的 system call ,對於深入分析 log file parallel write 等待事件的效能根因具有相當大的幫助。

 

總結 log file sync 等待事件對交易型系統(OLTP)的效能影響相當重大。建議將 redo log 放置於效能較佳、延遲較低的磁碟設備上;同時在應用程式設計上,對交易行為盡量採用批次處理,降低 commit 的發生頻率。透過這些做法,有助於有效縮短 log file sync 的等待時間,進而提升整體交易效能與系統吞吐量。

 

2026年1月29日 星期四

10. PDB Lockdown Profile

PDB lockdown profile 主要是用來限制 PDB 的某些操作,當一個使用者在多個 PDB 共用時

(例如 common user) ,使用者的權限就有被放大的風險,透過設定 PDB lockdown profile 可

以用來避免 common user 利用特定 PDB 所允許的功能進而對其它 PDB 造成影響。


PDB lockdown profile 可以限制三個層級 :

  • Statement : 限制命令的操作,例如於 CDB 層級建立 PDB lockdown profile 限制 alter system 操作 :

SQL> create lockdown profile lkp1;

SQL> alter lockdown profile lkp1 disable statement=('alter system');


於 PDB 設定參數 pdb_lockdown 套用 lockdown profile :

SQL> alter session set container=pdb1;

SQL> alter system set pdb_lockdown=lkp1;


套用之後此 PDB 就不能使用 alter system 命令 :

A black screen with white text

AI-generated content may be incorrect.

更進一步的設定可以只限制某個 alter system 操作,例如只限制 set 操作 :

SQL> alter lockdown profile lkp1 enable statement=('alter system');

SQL> alter lockdown profile lkp1 disable statement=('alter system') clause=('set');


這樣子設定可以執行 alter system 但 set 操作則是不允許 :

A black screen with white text

AI-generated content may be incorrect.

  • Feature : 限制 PDB 使用某些功能如 NETWORK_ACCESS (UTL_HTTP 、 UTL_TCP …等) 、 

    COMMON_SCHEMA_ACCESS (存取 common schema 共用物件) 、 OS_ACCESS (UTL_FILE …等) 、 

    JAVA與 JAVA_RUNTIME ,例如限制 PDB 不能使用 UTL_HTTP :

SQL> create lockdown profile lkp2;

SQL> alter lockdown profile lkp2 disable feature=('UTL_HTTP');


套用之後 PDB 使用 UTL_HTTP 就會出現 ORA-01031: insufficient privileges :

SQL> alter session set container=pdb1;

SQL> alter system set pdb_lockdown=lkp2;

A screen shot of a computer

AI-generated content may be incorrect.

  • Option : 限制 PDB 不能使用某些資料庫功能如 Partitioning 、 Advanced Queuing 、 

    Data Guard …等,例如限制 PDB 不能使用 Partition :

SQL> create lockdown profile lkp3;

SQL> alter lockdown profile lkp3 disable option=('PARTITIONING');

 

 套用之後於 PDB 建立 partition table 就會出現 ORA-00439: feature not enabled :

SQL> alter session set container=pdb1;

SQL> alter system set pdb_lockdown=lkp3;

A screen shot of a computer code

AI-generated content may be incorrect.

透過 dba_lockdown_profiles 可以查詢目前所有 lockdown profile 的設定 :

SQL> select PROFILE_NAME,RULE_TYPE,RULE,status from dba_lockdown_profiles;

A screen shot of a computer

AI-generated content may be incorrect.


PDB Lockdown Profile 提供了一種以 PDB 為邊界的安全控管機制,可有效限制系統操作、

功能與授權選項的使用範圍。