Oracle 10g中對resumable session的增強

逍遙三人發表於2012-03-18
轉載:http://www.cnblogs.com/minbear/archive/2008/04/22/1165135.html

從9i開始,Oracle提供了一種避免因為space Error而導致事務異常的操作,那就是resumable.通常,DBA在日常工作中,往往忽略了對空間資源上的需求,比如一個大的事務所需要的 temp,undo,data space等等。直到出現了經典的ORA-01652才恍然大悟。

下面回顧一下這個特性。


一、回顧9i中的功能(複習一下好了)
1)許可權設定
首先一個使用者要設定resumable session,必須具有resumable的許可權。
SQL> select * from system_privilege_map where name='RESUMABLE';
PRIVILEGE  NAME                                       PROPERTY
---------- ---------------------------------------- ----------
-236 RESUMABLE                                         0
SQL>
SQL> conn study/study
已連線。
SQL> alter session enable resumable;
ERROR:
ORA-01031: 許可權不足
SQL>
SQL> conn /as sysdba
已連線。
SQL>  grant resumable to study;
授權成功。
SQL> conn study/study
已連線。
SQL> alter session enable resumable;
會話已更改。
SQL>
當然了,resumable許可權也被包含在其他role裡面,比如dba,當一個使用者擁有dba role時
,就自動擁有了resumable privilege.
2)ENALBE resumable session
在9i中,我們可以通過如下的設定,讓一個session當遇到空間分配不足的時候繼續。
SQL> alter session enable resumable;
3)DISABLE resumable session
和enable 相反
SQL> alter session disable resumable;
4)超時設定
resumable session的預設超時時間為7200秒,也就是2小時。
我們可以通過如下的SQL來調整timeout的時間,比如
SQL> alter session enable resumable timeout 1800;
會話已更改。
SQL>
5)監控
我們可以通過dba_resumable和alert日誌來監控resumable session的狀態。
SQL> alter session enable resumable timeout 10;
會話已更改。
SQL> select user_id,SESSION_ID, STATUS, START_TIME, SUSPEND_TIME,
2         SQL_TEXT, ERROR_NUMBER, ERROR_MSG
3  from dba_resumable;
USER_ID  SESSION_ID STATUS    START_TIME        SUSPEND_TIME
---------- ---------- --------- ----------------- --------------
61         49 NORMAL
SQL_TEXT      ERROR_NUMBER ERROR_MSG
------------- ------------ -------------
0
SQL>  create index inx_res_test on res_test(owner,object_id,object_name) 
         tablespace test;
。。。
SQL> select user_id,SESSION_ID, STATUS, START_TIME, SUSPEND_TIME,
2         SQL_TEXT, ERROR_NUMBER, ERROR_MSG
3  from dba_resumable;
USER_ID  SESSION_ID STATUS    START_TIME           SUSPEND_TIME
---------- ---------- --------- -------------------- --------------------
61         49 SUSPENDED 02/26/07 10:31:20    02/26/07 10:31:20
SQL_TEXT                                   ERROR_NUMBER
------------------------------------------ ------------
create index inx_res_test on res_test      1536
(owner,object_id,object_name) tablespace t
ERROR_MSG
----------------------------------------
ORA-01536: 超出表空間 'TEST' 的空間限額
超時以後:
SQL>  create index inx_res_test on res_test(owner,object_id,object_name) 
         tablespace test;
create index inx_res_test on res_test(owner,object_id,object_name) 
         tablespace test
*
第 1 行出現錯誤:
ORA-30032: 掛起的 (可恢復) 語句已超時
ORA-01536: 超出表空間 'TEST' 的空間限額
SQL>
同時,當resumable session 被掛起時,在alert 日誌檔案中也會有相應的記錄資訊
    ,如下所示:
Mon Feb 26 10:29:37 2007
statement in resumable session 'User STUDY(61), Session 49, Instance 1'
    was suspended due to ORA-01536: 超出表空間 'TEST' 的空間限額
6)dbms_reumable包
Oracle也提供了一個dbms_resumable package來設定獲取或異常終止一個
   resumable session的操作。
這個包比較簡單。我簡單的示範一下。有興趣的同志,可以參考Oracle的online doc.
SQL> alter session enable resumable;
會話已更改。
SQL> exec dbms_resumable.set_session_timeout(49,1800);
PL/SQL 過程已成功完成。
SQL> select dbms_resumable.get_session_timeout(49) from dual;
DBMS_RESUMABLE.GET_SESSION_TIM
------------------------------
1800
SQL>
SQL> create index inx_res_test on res_test(owner,object_id,object_name)
   tablespace test;
...
{因為表空間不足,所以被掛起}
開啟另外一個session,可以取消上面的操作,而不必等到timeout
SQL> exec dbms_resumable.abort(49);
PL/SQL procedure successfully completed
SQL>
在session id 為49的互動介面將得到如下的返回資訊:
SQL> create index inx_res_test on res_test(owner,object_id,object_name)
   tablespace test;
create index inx_res_test on res_test(owner,object_id,object_name) 
   tablespace test
*
第 1 行出現錯誤:
ORA-01013: 使用者請求取消當前的操作
SQL>
二、10g中的增強
在10g中,Oracle一樣支援9i的上述方法,同時做了增強。
1)增加了一個resumable_timeout的引數
該引數可以在system和session level級均可以修改.對RAC db,每個instance可以單獨設定.
而9i中只能在session一級中設定。比如: 
SQL> show parameter resumable_timeout;
NAME                                 TYPE           VALUE
------------------------------------ -------------- -------
resumable_timeout                    integer        0
SQL> alter system set resumable_timeout=60;
系統已更改。
SQL>  create index inx_res_test on res_test(owner,object_id,object_name)
 tablespace test;
create index inx_res_test on res_test(owner,object_id,object_name) 
 tablespace test
*
第 1 行出現錯誤:
ORA-30032: 掛起的 (可恢復) 語句已超時
ORA-01652: 無法通過 8 (在表空間 TEST 中) 擴充套件 temp 段
SQL>
2)對分散式事務的支援
In 9i, users are not allowed to start a distributed transaction in a resumable
enabled session.  And if a session has a distributed transaction, users 
are not allowed to enable resumable.
These restrictions are removed in 10g. However, in a distributed transaction,
if users enable/disable resumable or change resumable_timeout, only the local
instances are affected. In a distributed transaction, sessions on remote
instances are suspended if resumable has been enabled in the remote instance.
3)增加了一個監控的檢視
在10g中,我們也可以通過DBA_OUTSTANDING_ALERTS 來監控
resumable session.比如:
SQL> create index inx_res_test on res_test(owner,object_id,object_name)
tablespace test;
create index inx_res_test on res_test(owner,object_id,object_name) 
tablespace test
*
第 1 行出現錯誤:
ORA-30032: 掛起的 (可恢復) 語句已超時
ORA-01652: 無法通過 8 (在表空間 TEST 中) 擴充套件 temp 段
SQL> select object_name,object_type,reason,message_type,message_level
2  from dba_outstanding_alerts
3  where message_group='Space';
OBJECT_NAME  OBJECT_TYPE  REASON
------------ ------------ -----------------------------------------------
TEST         TABLESPACE   對可恢復會話 User STUDY(61),Session 49,Instance 1
(會話 ID 為 49) 的操作被掛起
MESSAGE_TYPE MESSAGE_LEVEL
------------ -------------
Warning      5
SQL>
三、resumable操作在其他utiliy中的使用
在exp/imp,sql*loader工具,同樣也支援resumable操作,本文不再多加介紹,
大家可以參考Oracle online doc獲取更多的資訊。
最後,這個特性還是很有用的。我們可以在臨近下班的時候,開始一個很大的create
index的操作,設定2小時的timeout,然後就可以回家吃飯了,如果中間因為space不
足而掛起,我們也可以及時的收到簡訊告警[別的朋友可能有其他的監控],調整後,
讓事務繼續。多爽!啥也不耽誤。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21584437/viewspace-718888/,如需轉載,請註明出處,否則將追究法律責任。

相關文章