resumable session
需要RESUMABLE 权限
主要在空间不足时候不立刻返回错误,而是出现一些ALERT(ALERT.LOG DBA_OUTSTANDING_ALERTS 中) 给DBA一个处理错误的时间,处理完成后 还可以继续执行
SQL> ed
已写入 file afiedt.buf
1 declare
2 begin
3 for i in 1..300 loop
4 insert into sys.t1 values('a','a','a');
5 end loop;
6 commit;
7* end;
SQL> /
declare
*
第 1 行出现错误:
ORA-01653: 表 SYS.T1 无法通过 128 (在表空间 TEST2 中) 扩展
ORA-06512: 在 line 4
SQL> alter session enable resumable;开启使用 default 7200 S 可以修改
alter session enable resumable timeout XXX
会话已更改。
SQL> ed
已写入 file afiedt.buf
1 declare
2 begin
3 for i in 1..300 loop
4 insert into sys.t1 values('a','a','a');
5 end loop;
6 commit;
7* end;~~~~~~~~~~~~~~~~~~~~~~HUNG住 ,当超过TIMEOUT后返回错误
SQL> /
另一SESSION
SQL> select reason,object_type from dba_outstanding_alerts where object_name='TEST2 *************
';
REASON
--------------------------------------------------------------------------------
OBJECT_TYPE
----------------------------------------------------------------
表空间 [TEST2] 已占用 [80 percent]~~~这是上个实验dbms_server_alert时候的
TABLESPACE
对可恢复会话 User XH(61), Session 146, Instance 1 (会话 ID 为 146) 的操作被挂起,
原因是表空间 TEST2 中出错。错误消息为 ORA-01653: 表 SYS.T1 无法通过 128 (在表空
间 TEST2 中) 扩展~~~~~~~~~~~~~~~~~~~~~~~
TABLESPACE
SQL> select b.tablespace_name, b.bytes/1024/1024 FREESPACE ,a.table_name from user_
tables a ,dba_free_space b where a.tablespace_name=b.tablespace_name and a.table_na
me='T1';
TABLESPACE_NAME FREESPACE TABLE_NAME
------------------------------ ---------- ------------------------------
TEST2 .9375 T1
不够插入的了
另外 alert.log中也有信息
Wed Sep 09 16:21:59 2009
statement in resumable session 'User XH(61), Session 146, Instance 1' was suspended due to
ORA-01653: 表 SYS.T1 无法通过 128 (在表空间 TEST2 中) 扩展
SQL> alter database datafile 'd:\test2.dbf' resize 10m;~~解决问题后
数据库已更改。
SQL> /
PL/SQL 过程已成功完成。~~~~~~~~~~刚才 的执行完成
SQL> select reason,object_type from dba_outstanding_alerts where object_name='TEST2
';
未选定行
用dbms_resumable包来 实验下
SQL> desc dbms_resumable;
PROCEDURE ABORT
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
SESSIONID NUMBER IN
FUNCTION GET_SESSION_TIMEOUT RETURNS NUMBER
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
SESSIONID NUMBER IN
FUNCTION GET_TIMEOUT RETURNS NUMBER
PROCEDURE SET_SESSION_TIMEOUT
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
SESSIONID NUMBER IN
TIMEOUT NUMBER IN
PROCEDURE SET_TIMEOUT
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
TIMEOUT NUMBER IN
FUNCTION SPACE_ERROR_INFO RETURNS BOOLEAN
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
ERROR_TYPE VARCHAR2 OUT
OBJECT_TYPE VARCHAR2 OUT
OBJECT_OWNER VARCHAR2 OUT
TABLE_SPACE_NAME VARCHAR2 OUT
OBJECT_NAME VARCHAR2 OUT
SUB_OBJECT_NAME VARCHAR2 OUT
SQL> create user test identified by a123 default tablespace test2 quota unlimited o
n test2;
用户已创建。
SQL> grant connect to test;
授权成功。
SQL>
SQL> conn / as sysdba
已连接。
SQL> grant insert on sys.t1 to test;
授权成功。
SQL> grant resumable to test;
授权成功。
SQL> conn test/a123
已连接。
SQL> select sid,serial#,schemaname from v$session where schemaname='TEST';(另一SESSION)
SID SERIAL# SCHEMANAME
---------- ---------- ------------------------------
146 2881 TEST
CONN TEST/A123
SQL> alter session enable resumable;
会话已更改。
SQL> ed
已写入 file afiedt.buf
1 declare
2 begin
3 for i in 1..3000 loop
4 insert into sys.t1 values('a','a','a');
5 end loop;
6 commit;
7* end;
SQL> /~~~~~~~~~~~~~~~~~~~~~~~~~~HUNG了
SQL> select dbms_resumable.get_session_timeout(146) from dual;(另一SESSION)
DBMS_RESUMABLE.GET_SESSION_TIMEOUT(146)
---------------------------------------
7200~~~~~~~~看到还要7200秒才行
SQL> execute dbms_resumable.set_session_timeout(146,20);
PL/SQL 过程已成功完成。
SQL> select dbms_resumable.get_session_timeout(146) from dual;
DBMS_RESUMABLE.GET_SESSION_TIMEOUT(146)
---------------------------------------
20
SQL> /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~只会HUNG 20S
declare
*
第 1 行出现错误:
ORA-30032: 挂起的 (可恢复) 语句已超时~~~~~~~~~~~~~~~~
ORA-01653: 表 SYS.T1 无法通过 128 (在表空间 TEST2 中) 扩展
ORA-06512: 在 line 4
SQL> execute dbms_resumable.set_session_timeout(146,1000);
PL/SQL 过程已成功完成。
SQL> select dbms_resumable.get_session_timeout(146) from dual;
DBMS_RESUMABLE.GET_SESSION_TIMEOUT(146)
---------------------------------------
1000
SQL> /~~~~~~~~~~~~TEST USER 再执行 HUNG
SQL> execute dbms_resumable.abort(146);(另一个SESSION)~~~强制关闭
PL/SQL 过程已成功完成。
SQL> /(TEST USER)
declare
*
第 1 行出现错误:
ORA-01013: 用户请求取消当前的操作
ORA-06512: 在 line 4
SQL>
SQL> show parameter resumable(10G 有了这个参数 ,以前9I 只能对SESSION LEVLE,现在可以对SYSTEM 了)
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resumable_timeout integer 0
SQL> alter system set resumable_timeout =1800;
系统已更改。
1 declare
2 begin
3 for i in 1..3000 loop
4 insert into sys.t1 values('a','a','a');
5 end loop;
6 commit;
7* end;
SQL> /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~HUNG 了
而且不需要 resumable权限了
SQL> create user test2 identified by a123 default tablespace test2 quota unlimited
on test2;
用户已创建。
SQL> grant connect to test2;
授权成功。
SQL> grant insert on sys.t1 to test2;
授权成功。
SQL> conn test2/a123
已连接。
SQL> ed
已写入 file afiedt.buf
1 declare
2 begin
3 for i in 1..3000 loop
4 insert into sys.t1 values('a','a','a');
5 end loop;
6 commit;
7* end;
SQL> /~~~~~~~~~~~~~~~~~~~~~~HUNG了
SQL> select sid,serial#,schemaname from v$session where schemaname='TEST2';(另一个SESSION)
SID SERIAL# SCHEMANAME
---------- ---------- ------------------------------
146 2887 TEST2
SQL> execute dbms_resumable.abort(146);
PL/SQL 过程已成功完成。
SQL> alter system reset resumable_timeout scope=spfile sid='*';
系统已更改。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12020513/viewspace-614290/ ,如需转载,请注明出处,否则将追究法律责任。