使用Oracle PROFILE控制會話空閑時間
客戶想實現對會話空閑時間的控制,下面是做的一個例子。
Microsoft Windows [版本 6.1.7601]
著作權 (c) 2009 Microsoft Corporation。著作權所有,並保留一切權利。
C:\Users\LIUBINGLIN>sqlplus sys/Oracle123@localhost:1521/hello as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on 星期二 4月 14 08:42:55 2015
Copyright (c) 1982, 2011, Oracle. All rights reserved.
串連到:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> create profile test_profile limit idle_time 1; 表示允許的空閑時間為1分鐘。
設定檔已建立
SQL> set linesize 200
SQL> select * from dba_profiles where profile='TEST_PROFILE';
PROFILE RESOURCE_NAME RESOURCE LIMIT
------------------------------ -------------------------------- -------- ----------------------------------------
TEST_PROFILE COMPOSITE_LIMIT KERNEL DEFAULT
TEST_PROFILE SESSIONS_PER_USER KERNEL DEFAULT
TEST_PROFILE CPU_PER_SESSION KERNEL DEFAULT
TEST_PROFILE CPU_PER_CALL KERNEL DEFAULT
TEST_PROFILE LOGICAL_READS_PER_SESSION KERNEL DEFAULT
TEST_PROFILE LOGICAL_READS_PER_CALL KERNEL DEFAULT
TEST_PROFILE IDLE_TIME KERNEL 1
TEST_PROFILE CONNECT_TIME KERNEL DEFAULT
TEST_PROFILE PRIVATE_SGA KERNEL DEFAULT
TEST_PROFILE FAILED_LOGIN_ATTEMPTS PASSWORD DEFAULT
TEST_PROFILE PASSWORD_LIFE_TIME PASSWORD DEFAULT
PROFILE RESOURCE_NAME RESOURCE LIMIT
------------------------------ -------------------------------- -------- ----------------------------------------
TEST_PROFILE PASSWORD_REUSE_TIME PASSWORD DEFAULT
TEST_PROFILE PASSWORD_REUSE_MAX PASSWORD DEFAULT
TEST_PROFILE PASSWORD_VERIFY_FUNCTION PASSWORD DEFAULT
TEST_PROFILE PASSWORD_LOCK_TIME PASSWORD DEFAULT
TEST_PROFILE PASSWORD_GRACE_TIME PASSWORD DEFAULT
已選擇16行。
SQL> show parameter resource
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resource_limit boolean FALSE
resource_manager_cpu_allocation integer 4
resource_manager_plan string
SQL> alter system set resource_limit =true; 對PROFILE中KERNEL類型的項目進行控制需要將該參數設定為TRUE,PASSWORD類型的項目不受此參數限制。
系統已更改。
SQL> create user test111 identified by test111 default tablespace users temporary tablespace temp profile test_profile;
使用者已建立。
SQL> grant connect,resource to test111;
授權成功。
另外視窗開一個會話:
C:\Users\LIUBINGLIN>sqlplus test111/test111@localhost:1521/hello
SQL*Plus: Release 11.2.0.3.0 Production on 星期二 4月 14 08:55:49 2015
Copyright (c) 1982, 2011, Oracle. All rights reserved.
串連到:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> create table test (id number);
create table test (id number)
*
第 1 行出現錯誤:
ORA-02396: 超出最大空閑時間, 請重新串連
空閑一分鐘後再操作就會收到上面的報錯。
但是客戶說以上的方法只是適用於SQLPLUS,對PL/SQL工具無效,下面討論一下為什麼對PL/SQL無效。
使用test111登陸PL/SQL之後查看資料庫會話資訊:
成功登陸後在資料庫裡面看到建立了兩個session,可以看到session的login時間是11:17:09和11:17:28兩個時間點。由於沒有執行任何SQL,登陸成功後的session狀態是INACTIVE的。
IDLE_TIME設定的為1分鐘,1分鐘後兩個會話的狀態變成了SNIPED,表示會話已經到期。
當在PL/SQL中執行任何SQL語句的時候,PL/SQL沒有報錯,成功執行。
但是從後台看,登陸時間變成了11:20:47和11:20:51,狀態又變成了INACTIVE。
說明在PL/SQL執行SQL語句的時候自動的重新登陸了。
下面是SQLPLUS的情況:
11:37:26登陸成功後,為SQLPLUS建立了一個SESSION,
1分鐘沒操作後會話變成了SNIPED狀態。
再次到該會話操作時,收到如下報錯:
從上一張圖片可以看出,從後台看SQLPLUS的SESSION已經被KILL。
由此可以判斷,PROFILE IDLE_TIME對SQLPLUS有效,對PL/SQL無效跟用戶端有很大關係。
通過這個實驗還可以發現一點,會話到期後,會話的狀態會變成SNIPED,該會話不會被立即KILL,直到會話對應的用戶端下次執行SQL時被KILL,說明這段時間會話對應的伺服器處理序一直存在,如果這樣的會話很多,且SNIPED存在的狀態持續較長時間,那麼資料庫可能超過PROCESSES初始化參數的限制。
另外這裡解釋一下sqlnet.ora設定檔中配置SQLNET.EXPIRE_TIME參數的含義:
SQLNET.EXPIRE_TIME=1表示每過1分鐘都向用戶端發出一個測試連接的包,用戶端收到後會給出響應,如果串連正常,這個串連是不會被殺掉的。
這個參數是用於解決用戶端無故關閉,網路出現故障,再指定的時間內殺掉伺服器處理序。
Oracle推薦PROFILE和SQLNET.EXPIRE_TIME一起使用,但由於PL/SQL工具本身的特點,它會在SESSION的狀態變成SNIPED(PROFILE IDLE_TIME逾時)後,第一次操作的時候自動重新串連,所以這兩種方法都控制不了它。
Oracle提出一種方法,就是在Oracle伺服器端部署定時殺掉SNIPED狀態會話的指令碼。但是為了處理少量的PL/SQL用戶端,未免有點大費周章了。
--end--