ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle实验记录 (可恢复session)

oracle实验记录 (可恢复session)

原创 Linux操作系统 作者:fufuh2o 时间:2009-09-09 17:14:15 0 删除 编辑

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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-06-26

  • 博文量
    182
  • 访问量
    471644