ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 空间RESUMABLE操作(三)

空间RESUMABLE操作(三)

原创 Linux操作系统 作者:yangtingkun 时间:2009-06-30 23:49:06 0 删除 编辑

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

这一篇简单介绍空间RESUMABLEAFTER SUSPEND触发器。

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

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

 

 

前面介绍了OracleRESUMABLE特性,不过RESUMABLE特性有一个显而易见的缺点,就是没有任何的信息返回给用户。如果用户没有意识到问题,就会一直处于的等待状态中。

Oracle提供了一个AFTER SUSPEND触发器,对解决这种情况有一些帮助。

SQL> CONN / AS SYSDBA
已连接。
SQL> CREATE OR REPLACE TRIGGER TRI_AFTER_SUSPEND
  2  AFTER SUSPEND ON DATABASE
  3  DECLARE
  4   PRAGMA AUTONOMOUS_TRANSACTION;
  5   V_RESULT BOOLEAN;
  6   V_ERROR_TYPE VARCHAR2(32767);
  7   V_OBJECT_TYPE VARCHAR2(32767);
  8   V_OBJECT_OWNER VARCHAR2(30);
  9   V_TABLESPACE_NAME VARCHAR2(30);
 10   V_OBJECT_NAME VARCHAR2(128);
 11   V_SUB_OBJECT_NAME VARCHAR2(128);
 12   V_CONNECT UTL_SMTP.CONNECTION;
 13   V_RECEIVE VARCHAR2(100) := 'yangtk@cis.com.cn';
 14   V_SERVER VARCHAR2(100) := 'mail.itpub.net';
 15   V_SENDER VARCHAR2(100) := 'yangtingkun@itpub.net';
 16   V_PASSWORD VARCHAR2(100) := 'password';
 17  BEGIN
 18   V_RESULT := DBMS_RESUMABLE.SPACE_ERROR_INFO(
 19    V_ERROR_TYPE,
 20    V_OBJECT_TYPE,
 21    V_OBJECT_OWNER,
 22    V_TABLESPACE_NAME,
 23    V_OBJECT_NAME,
 24    V_SUB_OBJECT_NAME);
 25   V_CONNECT := UTL_SMTP.OPEN_CONNECTION(V_SERVER, 25);
 26   UTL_SMTP.HELO(V_CONNECT, V_SERVER);
 27   UTL_SMTP.COMMAND(V_CONNECT, 'AUTH LOGIN');
 28   UTL_SMTP.COMMAND
 29   (
 30    V_CONNECT,
 31    UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(V_SENDER)))
 32   );
 33   UTL_SMTP.COMMAND
 34   (
 35    V_CONNECT,
 36    UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(V_PASSWORD)))
 37   );
 38   UTL_SMTP.MAIL(V_CONNECT, V_SENDER);
 39   UTL_SMTP.RCPT(V_CONNECT, V_RECEIVE);
 40   UTL_SMTP.DATA
 41   (
 42    V_CONNECT,
 43    'Suspend errors! ' || V_OBJECT_TYPE || ' ' || V_OBJECT_OWNER || '.' || V_OBJECT_NAME
 44     || ' on tablespace ' || V_TABLESPACE_NAME || ' is suspend, error is ' || V_ERROR_TYPE
 45   );
 46   UTL_SMTP.QUIT(V_CONNECT);
 47  END;
 48  /

触发器已创建

利用这个触发器的功能,可以在发生SUSPEND后,向指定的邮箱发送邮件,这样就可以避免用户没有意识到SUSPEND的产生,而一直处于等待的情况。

SQL> CONN YANGTK/YANGTK
已连接。
SQL> SELECT SUM(BYTES)/1024/1024 FROM DBA_FREE_SPACE
  2  WHERE TABLESPACE_NAME = 'YANGTK';

SUM(BYTES)/1024/1024
--------------------
            214.4375

SQL> ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600;

会话已更改。

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

当前用户进入SUSPEND状态后,用户可以收到相应的邮件通知。

 

邮件内容如下:

Suspend errors!  . on tablespace YANGTK is suspend, error is NO MORE SPACE

由于是创建对象过程报错,因此对象本身还没有创建成功,没有取到OWNEROBJECT_NAME是正常的现象,不过即使没有OWNEROBJECT_NAME的信息,这个邮件也足以说明当前碰到的错误了。

 

 

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

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10404471