1 可恢复的空间分配的概览
Oracle数据库服务器提供了在空间分配失败时暂停并随后再执行恢复操作。这样能够采取纠正操作,而不是由Oracle数据库服务器向用户返回错误。纠正错误后,暂停的操作将自动恢复。这个特性称为“可恢复空间分配”。受影响的语句称为“可恢复语句”。只有当系统或会话启用了可恢复语句特性时,语句才会以可恢复模式执行。
挂起语句会自动导致挂起事务。因此,在SQL语句的挂起和恢复过程中,所有事务资源都被保留。当错误条件消失时(例如,由于用户干预或其他查询释放的排序空间),挂起的语句自动恢复执行。当发生下列情况之一时,恢复语句被挂起:
Out of space condition
Maximum extents reached condition
Space quota exceeded condition
挂起超时间隔与可恢复语句相关联。在超时时间间隔内(默认为2小时)挂起的可恢复语句将重新激活并将异常返回给用户。可恢复语句可以挂起并恢复多次。
2 启用和禁用可恢复的空间分配
只有在启用了恢复模式的会话中执行语句时,才能进行恢复空间分配。有两种方法来启用和禁用可恢复的空间分配:
发出ALTER SESSION ENABLE恢复命令。
使用ALTER SESSION或ALTER SYSTEM语句将RESUMABLE_TIMEOUT初始化参数设置为一个非零值。
当为会话或数据库启用恢复模式时,可以指定一个超时时间,如果没有发生任何干预,在此之后,挂起的语句将错误地输出。RESUMABLE_TIMEOUT初始化参数表示超时发生前的秒数。还可以使用以下命令指定超时时间:
ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600;
超时的值一直有效,直到被另一个ALTER SESSION ENABLE RESUMABLE语句更改,或者通过另一种方式更改,或者会话结束。使用ENABLE RESUMABLE TIMEOUT子句来启用恢复模式的默认超时时间间隔是7,200秒,也就是2小时。
exa:
ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600 NAME ‘multitab insert’;
查询涉及可回收空间的语句:
Example:
SELECT name, sql_text FROM user_resumable;
NAME SQL_TEXT
multitab insert INSERT INTO oldsales SELECT * FROM sh.sales;
3 示例图
1)INSERT语句遇到表示表已满的错误。
2)INSERT语句被挂起,并且没有错误传递给客户端。
3)可选地执行一个AFTER SUSPEND触发器。
4)可以选择激活SQL ERROR异常以中止语句。
5)如果没有中止语句,并且将空闲空间成功添加到表中,插入语句将继续执行。
4 可采取的行动
暂停期间可能采取的行动:
当恢复语句遇到可纠正的错误时,系统会在内部生成AFTER SUSPEND系统事件。用户可以在数据库和模式级别注册此事件的触发器。如果用户注册一个触发器来处理这个系统事件,那么触发器将在一个SQL语句被挂起之后执行。在AFTER SUSPEND触发器中执行的SQL语句总是不可恢复的,并且总是自治的。在触发器内启动的事务使用系统回滚段。施加这些条件是为了克服死锁,并减少触发器遇到与语句相同的错误条件的几率。
在触发器代码中,可以使用USER_RESUMABLE或DBA_RESUMABLE视图,或者DBMS_RESUMABLE视图。SPACE_ERROR_INFO函数用于获取关于可恢复语句的信息。
当可恢复语句被挂起时:
调用该语句的会话被置于等待状态。在V$SESSION_WAIT中插入一行,以等待包含“语句挂起,等待错误被清除”事件列的会话。
对需要额外资源以完成挂起的语句的对象发出操作挂起警报。
结束暂停的声明:
当错误条件得到解决(例如,由于DBA的干预或其他查询释放的排序空间)时,挂起的语句自动恢复执行,“可恢复的会话挂起”警报被清除。
通过使用DBMS_RESUMABLE.ABORT()过程,可以强制一个挂起的语句激活SERVE RERROR异常。这个过程可以由DBA调用,也可以由发布语句的用户调用。如果达到了与可恢复语句关联的暂停超时时间间隔,则该语句将自动终止,并向用户返回一个错误。
5 可以被恢复的语句
如下这些语句可以被回收:
查询语句: SELECT statements that run out of temporary space (for sort areas) are candidates for resumable execution.
DML: INSERT, UPDATE, and DELETE statements are candidates. INSERT INTO…SELECT from external tables can be resumable.
DDL: The following statements are candidates for resumable execution:
CREATE TABLE … AS SELECT
CREATE INDEX
ALTER INDEX … REBUILD
ALTER TABLE … MOVE PARTITION
ALTER TABLE … SPLIT PARTITION
ALTER INDEX … REBUILD PARTITION
ALTER INDEX … SPLIT PARTITION
CREATE MATERIALIZED VIEW
评论
