使用Oracle PROFILE控制會話空閑時間

來源:互聯網
上載者:User

使用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--

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.