空間RESUMABLE操作(一)

yangtingkun發表於2009-06-15

Oracle9i開始引入這個功能,當出現空間不足等相關的錯誤時,Oracle可以不是馬上返回錯誤資訊,並回滾當前的操作,而是將操作掛起,直到掛起時間超過RESUMABLE TIMEOUT,或者空間不足的錯誤被解決。

這一篇簡單介紹空間RESUMABLE的例子。

 

 

第一次碰到這個特性是在一次安裝9i資料庫的過程中,在利用DBCA工具建立資料庫的時候,由於一個輔助表空間設定的資料檔案比較小,導致表空間不足的問題產生,由於DBCA啟用了這個特性,使得DBCA的建庫程式在一個地方停留了很久(大概半個小時以上),這時才意識到安裝過程碰到了以前沒有遇到的問題。

由於此時資料庫的資料字典已經完全生成,因此透過sqlplus登陸到資料庫,進行系統狀態,以及安裝程式的等待資訊,才發現資料庫建庫操作進入SUSPEND狀態,找到問題後,將目標表空間的資料檔案加大,於是DBCA得以進行執行,並最終完成了建庫操作。

由於9i啟用了這個特性,使得當時的建庫操作沒有因為空間不足而中途中止,因此當時對這個特性印象比較深。使用這個特性,可以使得一個長時間執行的資料庫操作,不至於因為空間相關的錯誤而回滾,給了使用者解決問題,並繼續處理的能力。

9i中,RESUMABLE只能在會話級設定,而在10g中,Oracle新增了RESUMABLE_TIMEOUT初始化引數,使得RESUMABLE特性可以在資料庫的例項級上進行設定。

SQL> SELECT * FROM V$VERSION;

BANNER
------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
PL/SQL Release 9.2.0.4.0 - Production
CORE    9.2.0.3.0       Production
TNS for 32-bit Windows: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

SQL> CREATE USER U_RESUMABLE IDENTIFIED BY U_RESUMABLE;

使用者已建立。

SQL> GRANT CONNECT TO U_RESUMABLE;

授權成功。

SQL> ALTER USER U_RESUMABLE QUOTA 1M ON USERS;

使用者已更改。

SQL> CONN U_RESUMABLE/U_RESUMABLE@YTK92
已連線。
SQL> SET TIMING ON
SQL> CREATE TABLE T (ID NUMBER)
  2  STORAGE (INITIAL 1M)
  3  TABLESPACE USERS;

表已建立。

已用時間:  00: 00: 00.12
SQL> DROP TABLE T;

表已刪除。

已用時間:  00: 00: 01.12
SQL> CREATE TABLE T (ID NUMBER)
  2  STORAGE (INITIAL 2M)
  3  TABLESPACE USERS;
CREATE TABLE T (ID NUMBER)
*
1 行出現錯誤:
ORA-01536:
超出表空間'USERS'的空間限量


已用時間:  00: 00: 00.10

正常情況下,如果使用者建立物件超過使用者的QUOTA,則馬上會返回錯誤資訊,如果使用了RESUMABLE

SQL> CONN YANGTK/YANGTK@YTK92
已連線。
SQL> GRANT ALTER SESSION TO U_RESUMABLE;

授權成功。

已用時間:  00: 00: 00.01
SQL> GRANT RESUMABLE TO U_RESUMABLE;

授權成功。

已用時間:  00: 00: 00.03
SQL> CONN U_RESUMABLE/U_RESUMABLE@YTK92
已連線。
SQL> ALTER SESSION ENABLE RESUMABLE TIMEOUT 60;

會話已更改。

已用時間:  00: 00: 00.01
SQL> CREATE TABLE T (ID NUMBER)
  2  STORAGE (INITIAL 2M)
  3  TABLESPACE USERS;
CREATE TABLE T (ID NUMBER)
*
1 行出現錯誤:
ORA-30032:
掛起的 (可恢復) 語句已超時
ORA-01536:
超出表空間'USERS'的空間限量


已用時間:  00: 01: 01.81

可以看到,由於設定了會話的掛起超時為60秒,剛才執行0.1秒就會報錯的建表語句,這次掛起了1分鐘後在報錯。

再次執行這個操作:

SQL> CREATE TABLE T (ID NUMBER)
  2  STORAGE (INITIAL 2M)
  3  TABLESPACE USERS;

會話被掛起,並在1分鐘內在另外的會話中,加大當前使用者的QUOTA

SQL> CONN YANGTK/YANGTK@YTK92
已連線。
SQL> ALTER USER U_RESUMABLE QUOTA 5M ON USERS;

使用者已更改。

這時掛起的會話會自動繼續執行:


表已建立。

已用時間:  00: 00: 26.81
SQL>

合理的利用這個特性,可以避免很多由於空間不足引發的重複性工作。

 

 

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

相關文章