天天看點

ORACLE定期清理INACTIVE會話

   oracle資料庫會話有active、inactive、killed、

cached、sniped五種狀态。inactive狀态的會話表示此會話處于非活動、空閑、等待狀态。例如pl/sql

developer連接配接到資料庫,執行一條sql語句後,如果不繼續執行sql語句,那麼此會話就處于inactive狀态。一般情況下,少量的

inactvie會話對資料庫并沒有什麼影響,如果由于程式設計等某些原因導緻資料庫出現大量的會話長時間處于inactive狀态,那麼将會導緻大量的

系統資源被消耗,造成會話數超過系統session的最大值,出現ora-00018:maximum number of sessions

exceeded錯誤。

有時候需要清理那些長

時間處于inactive狀态的會話。人為定期檢查、殺掉這類會話肯定不太現實,要定期清理那些長時間處于inactive的會話,隻能通過作業來實作;

另外需要注意,kill掉這些會話需要需要謹慎,稍不注意,就有可能誤殺了一些正常的會話。那麼我們該如何定義這類會話呢?下面是我結合業務規則定義的:

  1: 會話的status必須為inactive,如果會話狀态為active、killed、cached、sniped狀态,不做考慮。

2:

會話必須已經長時間處于inactive狀态。例如,處于inactive狀态超過了兩小時的會話程序,才考慮kill。這個視具體業務或需求決定,有可

能超過半小時就可以殺掉會話程序。至于如何計算處于inactive會話狀态的時間,這個可以

通過v$session的last_call_et字段來判别,需要查詢處于inactive狀态兩小時或以上的會話,就可以通過查詢條件

s.last_call_et >= 60*60*2實作,當然最好寫成 s.last_call_et >= 7200

3: 連接配接到會話的程式。比如,某個特定的應用程式産生的inactive會話才要清理。例如, toad工具、pl/sql

developer工具。關于program這個需要根據目前項目的具體情況設定,下面僅僅使用toad.exe、w3wp.exe舉例說明。

ORACLE定期清理INACTIVE會話

如果是rac環境,那麼最好使用下面sql語句,使用全局視圖gv$session。

<b></b>

接下來建立存儲過程sys.db_kill_idle_clients. 友善調用該功能執行kill inactive 會話。注意:xxx部分用實際業務的program來替代。

另外,由于kill session是直接将session

kill掉,有可能出現導緻事物復原的現象,其實我們可以使用disconnect

session完成目前事務并終止session。這種方式比alter system kill session跟安全可靠。

然後,我們可以在作業(job)或schedule裡面定期調用該存儲過程,也可以通過背景作業結合shell腳本實作定期清理空閑會話的功能。例如如下所示。

建立killsession.sh腳本,調用該存儲過程sys.db_kill_idle_clients

在crontab裡面配置背景作業,每隔15分鐘運作一次,清理哪些滿足條件的空閑會話。

0,15,30,45 * * * * /home/oracle/cron/session/bin/killsession.sh &gt;/dev/null 2&gt;&amp;1