Oracle查詢session連接數和inactive以及 概要文件IDLE_TIME限制用戶最大空閑連接時間


-----############oracle會話和進程################--------------
--查詢會話總數
select count(*) from v$session;
--查詢進程總數
select count(*) from v$process;
--查詢哪些應用的連接數此時是多少
select b.MACHINE, b.PROGRAM , count(*) from v$process a, v$session b
where a.ADDR = b.PADDR and b.USERNAME is not null group by b.MACHINE ,
b.PROGRAM order by count(*) desc;
--查詢是否有死鎖 如果查詢結果為no rows selected,說明數據庫中沒有死鎖。否則說明數據庫中存在死鎖。
select * from v$locked_object;

接下來說明一下會話的狀態:
1.active 處於此狀態的會話,表示正在執行,處於活動狀態。
2.killed 處於此狀態的會話,表示出現了錯誤,正在回滾,當然,也是占用系統資源的。
還有一點就是,killed的狀態一般會持續較長時間,而且用windows下的工具pl/sql developer來kill掉,
是不管用的,要用命令:alter system kill session 'sid,serial#' ;
3.inactive 處於此狀態的會話表示不是正在執行的,比如select語句已經完成。
我一開始以為,只要是inactive狀態的會話,就是該殺,為什么不釋放呢。
其實,inactive對數據庫本身沒有什么影響,但是如果程序沒有及時commit,那么就會造成占用過多會話。解決inactive的方法最好的就是在oracle中直接設置超時時間。

 

下面是解決的方法:

Oracle會話達到一定連接時間自動斷開的方法

IDLE_TIME:限制每個會話所允許的最長連續空閑時間,超過這個時間會話將自動斷開。參數值是一個整數,單位是分鍾。

1.Oracle數據庫當中至少會有一個Profie文件,它可以限制口令和資源。建立oracle數據庫時候,oracle會自動建立命名為default的profile,初始化的default有默認值,下面可以查看默認的profile的資源和口令限制的詳細信息。

SQL> select PROFILE,RESOURCE_NAME,LIMIT from dba_profiles where PROFILE='DEFAULT';   

 

PROFILE      RESOURCE_NAME   LIMIT

-------------------- -------------------- --------------------

DEFAULT      COMPOSITE_LIMIT   UNLIMITED

DEFAULT      SESSIONS_PER_USER   UNLIMITED

DEFAULT      CPU_PER_SESSION       UNLIMITED

DEFAULT      CPU_PER_CALL           UNLIMITED

DEFAULT      LOGICAL_READS_PER_SESSION     UNLIMITED

   

 

DEFAULT      LOGICAL_READS_PER_CALL  UNLIMITED

     

 

DEFAULT      IDLE_TIME   UNLIMITED

這個是空閑時間用來限制用戶連接時間

 

PROFILE      RESOURCE_NAME   LIMIT

-------------------- -------------------- --------------------

DEFAULT      CONNECT_TIME     UNLIMITED

DEFAULT      PRIVATE_SGA     UNLIMITED

DEFAULT      FAILED_LOGIN_ATTEMPTS  10

     

 

DEFAULT      PASSWORD_LIFE_TIME   180

DEFAULT      PASSWORD_REUSE_TIME  UNLIMITED

DEFAULT      PASSWORD_REUSE_MAX   UNLIMITED

DEFAULT      PASSWORD_VERIFY_FUNC NULL

     TION

 

 

PROFILE      RESOURCE_NAME   LIMIT

-------------------- -------------------- --------------------

DEFAULT      PASSWORD_LOCK_TIME   1

DEFAULT      PASSWORD_GRACE_TIME  7

 

16 rows selected.

 

 

查看某個用戶的使用的profile文件,這個通過dba_users來查看。

SQL> select username,profile from dba_users where username='SYSTEM';

 

USERNAME      PROFILE

------------------------------------------------------------ --------------------

SYSTEM      DEFAULT

 

2.Oracle的系統參數RESOURCE_LIMIT是一個用來監控用戶對於數據庫資源使用的參數,當值為true的時候即為啟用,否則禁用(默認是禁用的)。該參數結合profile來控制多種資源的使用,如CPU_PER_SESSION,CONNECT_TIME等等,從而達到節省資源來實現高效性能。通過下面語句可以在RAC當中查看系統參數RESOURCE_LIMIT是否開啟。

SQL> select name,value from gv$parameter where name='resource_limit';

NAME              VALUE

resource_limit    FALSE

 

3.首先開啟這個參數

SQL> alter system set resource_limit=true;

 

System altered.

 

SQL> select name,value from gv$parameter where name='resource_limit';

 

NAME              VALUE

resource_limit     TRUE

 

4.修改profile的idle_time,單位為分鍾。設置為一小時60分鍾。

SQL> alter profile default limit idle_time 60;

Profile altered.

之后再查看一下

SQL> select PROFILE,RESOURCE_NAME,LIMIT from dba_profiles where RESOURCE_NAME='IDLE_TIME';

PROFILE      RESOURCE_NAME   LIMIT

-------------------- -------------------- --------------------

DEFAULT      IDLE_TIME   60

 

說明:

A:參數RESOURCE_LIMIT=TRUE用於啟用數據庫資源限制;

B:PROFILE用於實現資源的配置,創建或者修改已存在的PROFILE來調整各個具體資源的配置

C:一旦被限制的用戶超出所設定的閥值將收到資源配置相關的錯誤提示

D:被限制資源的狀態變為sniped

E:被限制資源的session對應的server process並沒有釋放,需要結合sqlnet.expire_time來釋放。

  通過idle_time限制session idle 時間。session idle超過設置時間,狀態為sniped (v$session).,然而OS下的process並不會釋放,當session(user process) 再次與server process 通訊,將關閉相應的server process.

 

5.使用SQLNET__EXPIRE_TIME清楚僵死的連接:

   數據庫連接的客戶端異常斷開后,其占有的資源並沒有被釋放,從v$session數視圖中依舊可以看到對應的session處於inactive狀態,且對應的服務器進程也沒有釋放,導致資源長時間被占有。SQLNET.EXPIRE_TIME專門用於清理那些異常斷開的情況:通過設定參數為非0值(單位為分鍾)來發送探測包以檢查客戶端異常斷開。一旦探測包找到了異常連接將返回錯誤,清楚對應的server process。

配置SQLNET.EXPIRE_TIME:對於SQLNET.EXPIRE_TIME的配置,需要修改sqlnet.ora,其路徑為$ORACLE_HOME/network/admin下面。然后添加SQLNET.EXPIRE_TIME選項,之后重啟監聽。

 

6.總結:

A:INACTIVE SESSION 是用戶建立連接之后,尚未執行任何操作或操作已經完成但沒有斷開,等同於與處於idle狀態,在v$session視圖呈現的是INACTIVE狀態。

B:對於使用resource_limit以及profile配置后用戶session超出idle_time的情形,在v$sessin視圖呈現sniped狀態

C:當在sqlnet.ora配置文件中設置SQLNET.EXPIRE_TIME參數為非領值時,僵死連接在EXPIRE_TIME制定時間后被清楚(設定24小時后將INACTIVE狀態的session置為SNPIED狀態,之后再半小時后清除僵死連接,理論上是行得通的)

D:設定SQLNET.EXPIRE_TIME為非零值之后,系統需要產生額外的開銷以及帶來網絡性能的下降。

E:對於需要及時釋放OS以及DB資源的情形,Oracle建議使用resource_limit以及profile限制的用戶連接同時並設定SQLNET.EXPIRE_TIME為非零值。
---------------------
作者:風流搞技術
來源:CSDN
原文:https://blog.csdn.net/qq_34556414/article/details/81533712
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM