ORACLE新參數MAX_IDLE_TIME和MAX_IDLE_BLOCKING_TIME簡介
2022-11-03 22:52 瀟湘隱者 閱讀(1312) 評論(0) 收藏 舉報Oracle 12.2 引入了新參數MAX_IDLE_TIME。它可以指定會話空閑的最大分鐘數。如果會話空閑的時間超過了這個閾值的話,這個會話將會被自動終止。其實在Oracle 10g& 11g時代,我還寫過腳本定期清理INACTIVE會話,當時寫的文章名為ORACLE定期清理INACTIVE會話”。從Oracle 12.2開始,就完全沒有必要這樣做了,設置一個簡單的參數即可解決這個問題,見微知著,一葉知秋。以后數據庫運維的趨勢確實是越來越簡單化,自動化。
MAX_IDLE_TIME這個參數的時間單位是分鐘,注意不是秒。可以在PDB級別或CDB級別修改。但是不能在會話級別修改(ALTER SESSION),另外,對于RAC實例,不同節點的值可以設置成不一樣。如果參數MAX_IDLE_TIME的值為0,表示不限制會話的空閑時間。當會話的空閑時間超過閾值時,會話被終止后,你會在客戶端收到ORA-03113錯誤。注意,有時候我們也會通過RESOURCE_LIMIT限制會話最大的空閑時間,通過在PROFILE里面設置IDLE_TIME的值來實現,如果是通過這種方式來終止會話的話,收到的錯誤為“ORA-02396: exceeded maximum idle time, please connect again”。注意兩者的區別。
另外,我們來看另外一個參數MAX_IDLE_BLOCKER_TIME ,這個參數最開始宣稱是ORACLE 21c引入的新特性,但是實際上ORACLE 19c已經有這個參數了。它定義了阻塞會話的最大會話空閑時間,以分鐘為單位。 默認值 0 也表示沒有限制。官方文檔關于這個參數的介紹如下:
A session is considered to be a blocking session when it is holding resources required by other sessions. For example:
- The session is holding a lock required by another session.
- The session is a parallel operation and its consumer group, PDB, or database has either reached its maximum parallel server limit or has queued parallel operations.
- The session’s PDB or database instance is about to reach its SESSIONS or PROCESSES limit.
This parameter differs from the MAX_IDLE_TIME parameter in that MAX_IDLE_TIME applies to all sessions (blocking and non-blocking), whereas MAX_IDLE_BLOCKING_TIME applies only to blocking sessions. Therefore, in order for MAX_IDLE_BLOCKING_TIME to be effective, its limit must be less than the MAX_IDLE_TIME limit.
當會話持有其它會話所需的資源時,該會話被視為阻塞會話. 例如
- 該會話持有另一個會話所需的鎖。
- 該會話是并行操作,并且其使用者組,PDB或數據庫已達到其最大并行服務器限制或已排隊的并行操作。
- 會話的PDB或數據庫實例即將達到其SESSIONS或PROCESSES限制。
這個參數與MAX_IDLE_TIME參數的不同之處在于,MAX_IDLE_TIME適用于所有會話(阻塞和非阻塞),而MAX_IDLE_BLOCKING_TIME僅適用于阻塞會話。 因此,為了使MAX_IDLE_BLOCKING_TIME有效,其限制必須小于MAX_IDLE_TIME限制。
注意事項:
此參數對并行查詢進程和 SYS 用戶會話都沒有影響。所以你不要用sys用戶去測試,否則你會發現它不生效。
This parameter does not have an effect on parallel query processes, nor on SYS user sessions.
此參數從Oracle 19c開始就已經提供了。不是從Oracle 21c開始。
This parameter is available starting with Oracle Database 19c.
有了這個參數,你又不用寫腳本kill阻塞會話了。你看,新增的一個功能/特性就能節省你很多工作。但是這個功能也還有一些不足的地方:DBA不清楚Kill了哪些會話,阻塞會話當時執行過什么SQL也無從得知,如果是自己寫的腳本,往往可以記錄這些信息,方便時候我們回溯、分析問題。如果Oracle在終止會話的同時,將這些信息寫入trace文件或數據字典,那就相當完美了。
浙公網安備 33010602011771號