空间RESUMABLE操作(二)

Oracle9i开始引入这个功能,当出现空间不足等相关的错误时,Oracle可以不是马上返回错误信息,并回滚当前的操作,而是将操作挂起,直到挂起时间超过RESUMABLE TIMEOUT,或者空间不足的错误被解决。

这一篇简单介绍空间RESUMABLE的相关视图和包。

空间RESUMABLE操作(一):http://yangtingkun.itpub.net/post/468/485892

 

 

前面简单介绍了空间RESUMABLE操作的使用,说明了一个会话如何才能ENABLE RESUMABLE语句,并设置TIMEOUT时间。

那么随后问题就是,当数据库中发生了空间RESUMABLE操作,一些语句处于SUSPEND状态,由于没有错误信息的返回,如何判断这些语句是由于空间不足被挂起,还是处于其他的原因而处于等待状态。

Oracle提供了USER_RESUMABLEDBA_RESUMABLE视图,通过常用的V$SESSION_WAIT视图同样可以查询到SUSPEND状态。

SQL> SELECT SUM(BYTES)/1024/1024          
  2  FROM DBA_FREE_SPACE
  3  WHERE TABLESPACE_NAME = 'TEST';

SUM(BYTES)/1024/1024
--------------------
            199.9375

SQL> CREATE TABLE T (ID NUMBER)
  2  TABLESPACE TEST
  3  STORAGE (INITIAL 300M);
CREATE TABLE T (ID NUMBER)
*
ERROR at line 1:
ORA-01659: unable to allocate MINEXTENTS beyond 24 in tablespace TEST

下面设置会话的RESUMABLE并设置TIMEOUT300秒:

SQL> ALTER SESSION ENABLE RESUMABLE TIMEOUT 300;

Session altered.

在另外的会话中查询:

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

Session altered.

SQL> SELECT SESSION_ID, STATUS, TIMEOUT, SUSPEND_TIME, RESUME_TIME, ERROR_NUMBER
  2  FROM DBA_RESUMABLE;

SESSION_ID STATUS       TIMEOUT SUSPEND_TIME         RESUME_TIME          ERROR_NUMBER
---------- --------- ---------- -------------------- -------------------- ------------
       120 NORMAL           300                                                      0

由于会话设置了ENABLE RESUMABLE,因此在DBA_RESUMABLE视图中,已经可以看到这个会话信息了,不过目前会话处于正常状态。

下面执行刚才报错的SQL语句:

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

会话进入到挂起状态,在另外的会话检查DBA_RESUMABLE视图:

SQL> SELECT SESSION_ID, STATUS, TIMEOUT, SUSPEND_TIME, RESUME_TIME, ERROR_NUMBER
  2  FROM DBA_RESUMABLE;

SESSION_ID STATUS       TIMEOUT SUSPEND_TIME         RESUME_TIME          ERROR_NUMBER
---------- --------- ---------- -------------------- -------------------- ------------
       120 SUSPENDED        300 06/16/09 17:12:53                                 1659

SQL> SELECT SID, EVENT
  2  FROM V$SESSION_WAIT
  3  WHERE SID = 120;

       SID EVENT                                             
---------- --------------------------------------------------
       120 statement suspended, wait error to be cleared     

当语句由于空间问题被挂起后,从DBA_RESUMABLE视图中可以看到会话的状态变为RESUPENDED,而且还有会话发生挂起的时间。

V$SESSION_WAIT视图或者10g以后的V$SESSION视图的EVENT列,也可以看到会话处于SUSPEND状态。

除了解决空间问题使得这个会话恢复正常外,还可以通过DBMS_RESUMABLE包对这个会话进行维护操作,比如使用ABORT中止会话的挂起:

SQL> EXEC DBMS_RESUMABLE.ABORT(120)

PL/SQL procedure successfully completed.

SQL> SELECT SESSION_ID, STATUS, TIMEOUT, SUSPEND_TIME, RESUME_TIME, ERROR_NUMBER
  2  FROM DBA_RESUMABLE;

SESSION_ID STATUS       TIMEOUT SUSPEND_TIME         RESUME_TIME          ERROR_NUMBER
---------- --------- ---------- -------------------- -------------------- ------------
       120 ABORTED          300                                                   1659

中止会话挂起后,可以从DBA_RESUMABLE看到会话处于ABORTED状态,导致会话发生挂起的错误信息仍然保留。

而刚才被挂起的会话并不是报错ORA-1659错误,而是操作被中止的错误:

CREATE TABLE T (ID NUMBER)
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation


SQL>

DBMS_RESUMABLE包除了ABORT过程外,还包括SET_TIMEOUTGET_TIMEOUT等过程:

SQL> SELECT DBMS_RESUMABLE.GET_TIMEOUT FROM DUAL;

GET_TIMEOUT
-----------
         -1

SQL> SELECT DBMS_RESUMABLE.GET_SESSION_TIMEOUT(120) FROM DUAL;

DBMS_RESUMABLE.GET_SESSION_TIMEOUT(120)
---------------------------------------
                                    300

当前会话没有设置ENABLE RESUMABLE,因此得到的结果是-1,如果要查询非当前会话的TIMEOUT值,使用GET_SESSION_TIMEOUT函数。

SQL> EXEC DBMS_RESUMABLE.SET_SESSION_TIMEOUT(120, 3600)                                  

PL/SQL procedure successfully completed.

SQL> SELECT DBMS_RESUMABLE.GET_SESSION_TIMEOUT(120) FROM DUAL;

DBMS_RESUMABLE.GET_SESSION_TIMEOUT(120)
---------------------------------------
                                   3600

SQL> SELECT SESSION_ID, STATUS, TIMEOUT, SUSPEND_TIME, RESUME_TIME, ERROR_NUMBER
  2  FROM DBA_RESUMABLE;

SESSION_ID STATUS       TIMEOUT SUSPEND_TIME         RESUME_TIME          ERROR_NUMBER
---------- --------- ---------- -------------------- -------------------- ------------
       120 NORMAL          3600                                                      0

可以看到,设置会话120TIMEOUT3600之后,同时会清除会话的状态信息,以及ERROR_NUMBER等信息。

除了在数据库中的视图中可以查询到错误信息,DBMS_RESUMABLE包的SPACE_ERROR_INFO函数,也可以看到错误信息,这个函数会在下一篇文章,配合AFTER SUSPEND触发器一起介绍。

最后,在数据库外的alert文件中,一样可以看到错误信息:

Tue Jun 16 17:01:48 2009
ORA-1652: unable to extend temp segment by 512 in tablespace                 TEST
Tue Jun 16 17:12:53 2009
statement in resumable session 'User TEST(74), Session 120, Instance 1' was suspended due to
    ORA-01659: unable to allocate MINEXTENTS beyond 24 in tablespace TEST
Tue Jun 16 17:14:34 2009
statement in resumable session 'User TEST(74), Session 120, Instance 1' was aborted

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-606540/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-606540/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值