yangtingkun
===========================================================
空间RESUMABLE操作(三)
===========================================================

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的信息,这个邮件也足以说明当前碰到的错误了。

yangtingkun 发表于:2009.06.30 23:49 ::分类: ( ORACLE ) ::阅读:(247次) :: 评论 (0)

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...