Chinaunix首页 | 论坛 | 博客
  • 博客访问: 154041
  • 博文数量: 30
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-31 21:58
文章分类

全部博文(30)

文章存档

2015年(1)

2014年(18)

2013年(11)

我的朋友

分类: Oracle

2013-08-01 10:04:45

原帖: 和 http://tomszrp.itpub.net/post/11835/264965

当 我们在建立一个大表,或往表里面插入大量数据时,如果中途因为表空间剩余空间不足并且没有开启自动扩展的话,会报 OUT-OF-SPACE错误,这是非常痛苦的事情,重头再来又耗时间又要挨骂。这种情况往往出现在我们还无法预估将要插入的数据量时,除了个一个极大的 表空间或自动扩展来解决之外。

Oracle还为我们提供了一个很好的功能:resumable

在resumable开启 的情况下,如果Oracle执行某一个SQL申请不到空间了,会停顿下来(时间可以由TIMEOUT来控制),但是不会报OUT-OF-SPACE这个错 误。等你把空间的问题解决了,Oracle会继续从停下来的部分开始刚才的SQL。是不是非常OK呢

步骤:
1)具有dba角色的用户:grant resumable to scott

2) scott下面就可以执行ALTER SESSION{ ENABLE RESUMABLE [ TIMEOUT integer ] [ NAME string ]| DISABLE RESUMABLE}
    如果在SQL中不指定NAME,Oracle自动生成的NAME= ‘Userusername(userid), Session sessionid, Instance instanceid’.

3)监控:通过USER_RESUMABLE and DBA_RESUMABLE来查看
        同时,当resumable session 被挂起时,在alert 日志文件中也会有相应的记录信息,如下所示:Mon Feb 26 10:29:37 2007   statement in
        resumable session 'User STUDY(61), Session 49, Instance 1'was suspended due to ORA-01536: 超出表空间 'TEST' 的空间限额

4)dbms_reumable包
     Oracle也提供了一个dbms_resumable package来设置获取或异常终止一个resumable session的操作。
     SQL> alter session enable resumable;
     SQL> exec dbms_resumable.set_session_timeout(49,1800);
     SQL> select dbms_resumable.get_session_timeout(49) from dual;
DBMS_RESUMABLE.GET_SESSION_TIM
------------------------------
1800
     SQL> create index inx_res_test on res_test(owner,object_id,object_name)tablespace test;
      ...
      {因为表空间不足,所以被挂起}

     打开另外一个session,可以取消上面的操作,而不必等到timeout
     SQL> exec dbms_resumable.abort(49);

     在session id 为49的交互界面将得到如下的返回信息:
SQL> create index inx_res_test on res_test(owner,object_id,object_name)tablespace test;
create index inx_res_test on res_test(owner,object_id,object_name)tablespace test
*
第 1 行出现错误:
ORA-01013: 用户请求取消当前的操作

   
     在10g中,Oracle一样支持9i的上述方法,同时做了增强。

    1)增加system和session level设置
         SQL> show parameter resumable_timeout;
        SQL> alter system set resumable_timeout=60;

   2)对分布式事务的支持
In 9i, users are not allowed to start a distributed transaction in a resumable
enabled session. And if a session has a distributed transaction, usersare not allowed to enable resumable.

These restrictions are removed in 10g. However, in a distributed transaction,if users enable/disable resumable or change resumable_timeout, only the local
instances are affected. In a distributed transaction, sessions on remote
instances are suspended if resumable has been enabled in the remote instance.

   3)增加了一个监控的视图
在10g中,我们也可以通过DBA_OUTSTANDING_ALERTS 来监控resumable session.比如:
SQL> create index inx_res_test on res_test(owner,object_id,object_name)tablespace test;
create index inx_res_test on res_test(owner,object_id,object_name)tablespace test
*
第 1 行出现错误:
ORA-30032: 挂起的 (可恢复) 语句已超时
ORA-01652: 无法通过 8 (在表空间 TEST 中) 扩展 temp 段


SQL> select object_name,object_type,reason,message_type,message_level
2 from dba_outstanding_alerts
3 where message_group='Space';

OBJECT_NAME OBJECT_TYPE REASON
------------ ------------ -----------------------------------------------
TEST TABLESPACE 对可恢复会话 User STUDY(61),Session 49,Instance 1
(会话 ID 为 49) 的操作被挂起
MESSAGE_TYPE MESSAGE_LEVEL
------------ -------------
Warning 5
SQL>

5)resumable操作在其他utiliy中的使用
在exp/imp,sql*loader工具,同样也支持resumable操作,本文不再多加介绍,大家可以参考Oracle online doc获取更多的信息。

最 后,这个特性还是很有用的。我们可以在临近下班的时候,开始一个很大的createindex的操作,设置2小时的timeout,然后就可以回家吃饭 了,如果中间因为space不足而挂起,我们也可以及时的收到短信告警[别的朋友可能有其他的监控],调整后,让事务继续。

阅读(1308) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~