從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 0SQL>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_MSG3 from dba_resumable;USER_ID SESSION_ID STATUS START_TIME SUSPEND_TIME---------- ---------- --------- ----------------- --------------61 49 NORMALSQL_TEXT ERROR_NUMBER ERROR_MSG------------- ------------ -------------0SQL> 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_MSG3 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:20SQL_TEXT ERROR_NUMBER------------------------------------------ ------------create index inx_res_test on res_test 1536(owner,object_id,object_name) tablespace tERROR_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 2007statement 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------------------------------1800SQL>SQL> create index inx_res_test on res_test(owner,object_id,object_name)
tablespace test;...{因為資料表空間不足,所以被掛起}開啟另外一個session,可以取消上面的操作,而不必等到timeoutSQL> exec dbms_resumable.abort(49);PL/SQL procedure successfully completedSQL>在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 0SQL> 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 resumableenabled 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 localinstances are affected. In a distributed transaction, sessions on remoteinstances 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_level2 from dba_outstanding_alerts3 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 5SQL>三、resumable操作在其他utiliy中的使用在exp/imp,sql*loader工具,同樣也支援resumable操作,本文不再多加介紹,大家可以參考Oracle online doc擷取更多的資訊。最後,這個特性還是很有用的。我們可以在臨近下班的時候,開始一個很大的createindex的操作,設定2小時的timeout,然後就可以回家吃飯了,如果中間因為space不足而掛起,我們也可以及時的收到簡訊警示[別的朋友可能有其他的監控],調整後,讓事務繼續。多爽!啥也不耽誤