Oracle的Resumable特性

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

这种情况往往出现在我们还无法预估将要插入的数据量时,除了个一个极大的表空间或自动扩展来解决之外。

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

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

需要的权限是resumable.

具体的语法:ALTER SESSION{ ENABLE RESUMABLE [ TIMEOUT integer ] [ NAME string ]| DISABLE RESUMABLE}相关数据字典:USER_RESUMABLE and DBA_RESUMABLE

如果在SQL中不指定NAME,Oracle自动生成的NAME= ‘Userusername(userid), Session sessionid, Instance instanceid’.

-----------------

从9i开始,Oracle提供了一种避免因为space Error而导致事务异常的操作,那就是resumable.通常,DBA在日常工作中,往往忽略了对空间资源上的需求,比如一个大的事务所需要的 temp,undo,data space等等。直到出现了经典的ORA-01652才恍然大悟。

下面回顾一下这个特性。


一、回顾9i中的功能(复习一下好了)
1)权限设置
首先一个用户要设置resumable session,必须具有resumable的权限。
SQL> select * from system_privilege_map where name='RESUMABLE';

PRIVILEGE NAME PROPERTY
---------- ---------------------------------------- ----------
-236 RESUMABLE 0

SQL>

SQL> conn study/study
已连接。
SQL> alter session enable resumable;
ERROR:
ORA-01031: 权限不足

SQL>
SQL> conn /as sysdba
已连接。
SQL> grant resumable to study;
授权成功。

SQL> conn study/study
已连接。
SQL> alter session enable resumable;

会话已更改。
SQL>

当然了,resumable权限也被包含在其他role里面,比如dba,当一个用户拥有dba role时,就自动拥有了resumable privilege.

2)ENALBE resumable session
在9i中,我们可以通过如下的设置,让一个session当遇到空间分配不足的时候继续。
SQL> alter session enable resumable;

3)DISABLE resumable session
和enable 相反
SQL> alter session disable resumable;

4)超时设置
resumable session的默认超时时间为7200秒,也就是2小时。
我们可以通过如下的来调整timeout的时间,比如

SQL> alter session enable resumable timeout 1800;

会话已更改。
SQL>

5)监控
我们可以通过dba_resumable和alert日志来监控resumable session的状态。
SQL> alter session enable resumable timeout 10;

会话已更改。

SQL> select user_id,SESSION_ID, STATUS, START_TIME, SUSPEND_TIME,
2 SQL_TEXT, ERROR_NUMBER, ERROR_MSG
3 from dba_resumable;

USER_ID SESSION_ID STATUS START_TIME SUSPEND_TIME
---------- ---------- --------- ----------------- --------------
61 49 NORMAL
SQL_TEXT ERROR_NUMBER ERROR_MSG
------------- ------------ -------------
0
SQL> create index inx_res_test on res_test(owner,object_id,object_name)tablespace test;

。。。

SQL> select user_id,SESSION_ID, STATUS, START_TIME, SUSPEND_TIME,
2 SQL_TEXT, ERROR_NUMBER, ERROR_MSG
3 from dba_resumable;

USER_ID SESSION_ID STATUS START_TIME SUSPEND_TIME
---------- ---------- --------- -------------------- --------------------
61 49 SUSPENDED 02/26/07 10:31:20 02/26/07 10:31:20
SQL_TEXT ERROR_NUMBER
------------------------------------------ ------------
create index inx_res_test on res_test 1536
(owner,object_id,object_name) tablespace t
ERROR_MSG
----------------------------------------
ORA-01536: 超出表空间 'TEST' 的空间限额

超时以后:
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-01536: 超出表空间 'TEST' 的空间限额

SQL>

同时,当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' 的空间限额

6)dbms_reumable包
Oracle也提供了一个dbms_resumable package来设置获取或异常终止一个resumable session的操作。
这个包比较简单。我简单的示范一下。有兴趣的同志,可以参考Oracle的online doc.
SQL> alter session enable resumable;

会话已更改。

SQL> exec dbms_resumable.set_session_timeout(49,1800);

PL/SQL 过程已成功完成。

SQL> select dbms_resumable.get_session_timeout(49) from dual;

DBMS_RESUMABLE.GET_SESSION_TIM
------------------------------
1800

SQL>
SQL> create index inx_res_test on res_test(owner,object_id,object_name)tablespace test;
...
{因为表空间不足,所以被挂起}

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

PL/SQL procedure successfully completed

SQL>

在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: 用户请求取消当前的操作

SQL>

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

1)增加了一个resumable_timeout的参数

该参数可以在system和session level级均可以修改.对 db,每个instance可以单独设置.
而9i中只能在session一级中设置。比如:SQL> show parameter resumable_timeout;

NAME TYPE VALUE
------------------------------------ -------------- -------
resumable_timeout integer 0

SQL> alter system set resumable_timeout=60;

系统已更改。

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>

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>

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


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

-------------------------------------------------------------end-----------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
resumable.js 是一个 JavaScript 库,用于在网络连接中断或暂停时,使文件上传能够恢复。以下是 resumable.js 的官方教程: 1. 安装 resumable.js 你可以通过 npm 安装 resumable.js: ``` npm install resumablejs ``` 或者,你可以将 resumable.js 下载到本地,并将其包含在你的 HTML 文件中: ``` <script src="path/to/resumable.js"></script> ``` 2. 准备 HTML 代码 在你的 HTML 文件中添加以下代码: ``` <input type="file" id="fileInput"> <button id="uploadButton">Upload</button> ``` 这将创建一个文件上传控件和一个上传按钮。 3. 初始化 resumable.js 在你的 JavaScript 文件中添加以下代码: ``` var r = new Resumable({ target: '/upload', chunkSize: 1 * 1024 * 1024, simultaneousUploads: 4, testChunks: false }); r.assignBrowse(document.getElementById('fileInput')); r.assignDrop(document.body); document.getElementById('uploadButton').addEventListener('click', function() { r.upload(); }); ``` 这将创建一个 Resumable 对象,并将其绑定到文件上传控件和上传按钮。`target` 属性指定文件上传的目标 URL,`chunkSize` 属性指定上传的块大小,`simultaneousUploads` 属性指定同时上传的块数,`testChunks` 属性指定是否测试上传的块。 4. 处理事件 你可以通过监听 Resumable 对象的事件来处理上传过程中的不同阶段。以下是一些常用的事件: - `fileAdded`:当文件添加到上传队列时触发。 - `fileSuccess`:当文件上传成功时触发。 - `fileError`:当文件上传失败时触发。 - `progress`:当上传进度发生变化时触发。 你可以使用以下代码来监听事件: ``` r.on('fileAdded', function(file) { console.log('File added:', file); }); r.on('fileSuccess', function(file) { console.log('File uploaded:', file); }); r.on('fileError', function(file, message) { console.log('File upload error:', file, message); }); r.on('progress', function() { console.log('Progress:', r.progress()); }); ``` 5. 完整示例 下面是一个完整的示例,演示如何使用 resumable.js 进行文件上传: ``` <!DOCTYPE html> <html> <head> <title>Resumable.js Example</title> <script src="path/to/resumable.js"></script> </head> <body> <input type="file" id="fileInput"> <button id="uploadButton">Upload</button> <script> var r = new Resumable({ target: '/upload', chunkSize: 1 * 1024 * 1024, simultaneousUploads: 4, testChunks: false }); r.assignBrowse(document.getElementById('fileInput')); r.assignDrop(document.body); r.on('fileAdded', function(file) { console.log('File added:', file); }); r.on('fileSuccess', function(file) { console.log('File uploaded:', file); }); r.on('fileError', function(file, message) { console.log('File upload error:', file, message); }); r.on('progress', function() { console.log('Progress:', r.progress()); }); document.getElementById('uploadButton').addEventListener('click', function() { r.upload(); }); </script> </body> </html> ``` 这个示例将上传文件块大小设置为 1MB,同时最多上传 4 个块。在文件添加、上传成功、上传失败和上传进度发生变化时,会在控制台中输出相应的信息。当点击上传按钮时,将触发上传操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值