从9i开始,Oracle提供了一种避免因为space Error而导致事务异常的操作,那就是resumable.通常,DBA在日常工作中,往往忽略了对空间资源上的需求,比如一个大的事务所需要的 temp,undo,data space等等。直到出现了经典的ORA-01652才恍然大悟,10G版本又对它做了增强,下面做个实验
SQL> create tablespace smailtbs datafile '/u01/app/oracle/oradata/ORCL/datafile/smailtbs.dbf' size 2m;
Tablespace created.
SQL> conn system/oracle
Connected.
SQL> create table anbob.testobj
2 as select * from dba_objects;
Table created.
SQL> conn anbob/anbob
Connected.
SQL> select bytes/1024/1024 from user_segments where segment_name='TESTOBJ'
2 ;
BYTES/1024/1024
---------------
6
SQL> create table tt tablespace smailtbs
2 as
3 select * from testobj;
select * from testobj
*
ERROR at line 3:
ORA-01652: unable to extend temp segment by 128 in tablespace SMAILTBS
SQL> conn system/oracle
Connected.
SQL> grant resumable to anbob
2 ;
Grant succeeded.
SQL> conn anbob/anbob
Connected.
SQL> alter session enable resumalb;
alter session enable resumalb
*
ERROR at line 1:
ORA-00922: missing or invalid option
SQL> alter session enable resumable;
Session altered.
SQL> create table tt tablespace smailtbs
2 as
3 select * from testobj;
挂起.....
打开另一个session anbob监控
SQL> select session_id,status,start_time,suspend_time,sql_text,error_number,error_msg
2* from user_resumable
SESSION_ID STATUS START_TIME SUSPEND_TIME
---------- ------------------ ---------------------------------------- ----------------------------------------
SQL_TEXT ERROR_NUMBER
-------------------------------------------------------------------------------- ------------
ERROR_MSG
------------------------------------------------------------------------------------------------------------------------------------------------------
153 SUSPENDED 05/03/11 18:13:50 05/03/11 18:13:51
create table tt tablespace smailtbs as select * from testobj 1652
ORA-01652: unable to extend temp segment by 128 in tablespace SMAILTBS
SQL> conn system/oracle
Connected.
SQL> alter database datafile '/u01/app/oracle/oradata/ORCL/datafile/smailtbs.dbf' resize 20m;
Database altered.
修改后发现第一个session的事务建表成功!
当我们在建立一个大表,或往表里面插入大量数据时,如果中途因为表空间剩余空间不足并且没有开启自动扩展的话,会报 OUT-OF-SPACE错误,如果等了两个小时换来这个错误,是非常痛苦的事情
这种情况往往出现在我们还无法预估将要插入的数据量时,除了个一个极大的表空间或自动扩展来解决之外。
Oracle还为我们提供了一个很好的功能:resumable
在resumable开启的情况下,如果Oracle执行某一个SQL申请不到空间了,会停顿下来(时间可以由TIMEOUT来控制),但是不会报OUT-OF-SPACE这个错误。等你把空间的问题解决了,Oracle会继续从停下来的部分开始刚才的SQL。
「喜欢文章,快来给作者赞赏墨值吧」 赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
请登录后发表评论