今天就跟大家聊聊有关Oracle可恢复空间分配技术是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
许多操作因为空间不够而失败,如果启用了可恢复空间分配,当操作遇到空间问题而不是因为错误而失败时,操作将暂停,显示为会话挂起。当错误得到解决时,它将继续。所有挂起的会话(当前挂起的和之前挂起但现在再次运行的)列在视图dba_resumable中。会话关闭后,视图中的记录将消除。
要在会话级别启用可恢复空间分配,命令如下:
alter session enable resumable [timeout <seconds>] [name <opname>];
timeout选项指定语句将挂起多长时间。如果到达这个时间,但问题没有解决,语句失败,返回错误。如果没有指定timeout,会话将无限期挂起。name选项指定在视图dba_resumable中显示的名称,帮助确定在多语句进程的哪个点出现空间问题。
执行该命令需要授予会话用户相应的权限:
grant resumable to <username>;
也可以通过设置实例参数resumable_timeout为所有会话启用可恢复空间。这是一个动态参数,如要设置一分钟的超时:
alter system set resumable_timeout=60;
这将导致所有会话在遇到空间问题时挂起一分钟。
Data Pump实用程序expdp和impdp有一个命令行开关resumable=y(默认为n),允许Data Pump作业如果遇到空间问题就挂起。
当会话挂起时,它将保持对使用的所有资源的控制,包括撤销空间、临时空间、PGA内存和记录锁定。
在遇到问题时,可以通过另一个会话交互式的进行修复。或者可以创建一个在会话挂起时将运行的after suspend on database触发器。这个触发器可以报告问题,如通过电子邮件,或包括检查并自动修复问题的代码,这就意味着可以在一些操作如插入数据导致表空间容量不够时,通过触发器程序确认后自动给表空间分配容量。
以下实验测试可恢复空间分配功能的使用:
1、创建表空间和表
create tablespace test datafile 'd:\oradata\mes\test01.dbf' size 2m;
create table scott.t1(c1 char(1000)) tablespace test;
2、授予会话可恢复空间分配的权限
grant resumable to scott;
3、在会话级别设定可恢复空间分配
conn scott/tiger
alter session enable resumable name 't1_insert';
4、向表中插入数据,因空间不足会话将被挂起
begin
for i in 1 .. 2000 loop
insert into scott.t1 values ('a row');
end loop;
commit;
end;
/
5、查看因空间分配问题挂起的会话
col name for a10
col sql_text for a30
col error_parameter1 for a10
col error_parameter2 for a10
col error_parameter3 for a10
col error_parameter4 for a10
col error_parameter5 for a10
col error_msg for a30
select user_id,
session_id,
instance_id,
status,
timeout,
start_time,
suspend_time,
resume_time,
name,
sql_text,
error_number,
error_parameter1,
error_parameter2,
error_parameter3,
error_parameter4,
error_parameter5,
error_msg
from dba_resumable;
USER_ID SESSION_ID INSTANCE_ID STATUS TIMEOUT START_TIME SUSPEND_TIME RESUME_TIME NAME SQL_TEXT ERROR_NUMBER ERROR_PARA ERROR_PARA ERROR_PARA ERROR_PARA ERROR_PARA ERROR_MSG
---------- ---------- ----------- --------- ---------- -------------------- -------------------- -------------------- ---------- ------------------------------ ------------ ---------- ---------- ---------- ---------- ---------- ------------------------------
84 74 1 SUSPENDED 7200 01/25/18 09:42:18 01/25/18 09:42:18 t1_insert INSERT INTO SCOTT.T1 VALUES (' 1653 SCOTT T1 128 TEST ORA-01653: 表 SCOTT.T1 无法通过 128
a row') (在表空间 TEST 中) 扩展
6、修复问题,会话将继续执行
alter database datafile 'd:\oradata\mes\test01.dbf' resize 4m;
7、再次查看因空间分配问题挂起的会话,显示会话已经恢复
select user_id,
session_id,
instance_id,
status,
timeout,
start_time,
suspend_time,
resume_time,
name,
sql_text,
error_number,
error_parameter1,
error_parameter2,
error_parameter3,
error_parameter4,
error_parameter5,
error_msg
from dba_resumable;
USER_ID SESSION_ID INSTANCE_ID STATUS TIMEOUT START_TIME SUSPEND_TIME RESUME_TIME NAME SQL_TEXT ERROR_NUMBER ERROR_PARA ERROR_PARA ERROR_PARA ERROR_PARA ERROR_PARA ERROR_MSG
---------- ---------- ----------- --------- ---------- -------------------- -------------------- -------------------- ---------- ------------------------------ ------------ ---------- ---------- ---------- ---------- ---------- ------------------------------
84 74 1 NORMAL 7200 01/25/18 10:00:39 t1_insert 0
8、删除表并清理表空间
drop table scott.t1;
drop tablespace test including contents and datafiles;
看完上述内容,你们对Oracle可恢复空间分配技术是怎样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。