在线重定义过程中需要exclusive lock.

执行DBMS_REDEFINITION.FINISH_REDEF_TABLE 存储过程完成表的在线重定

义。在此procedure运行过程中,原表会被以Exclusive lock mode(TM lmode=6)排他模式锁住

极为短暂的一段时间(秒级),具体这段时间的长短受到原表上数据量的影响。但有时候应用繁忙时可能不能立刻获得!

那么能不能使用一个参数让它多等待一段时间呢?

下面做个实验看看:

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\ibsadmin>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 8月 16 17:49:47 2012

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show parameter ddl_lock_timeout

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
ddl_lock_timeout                     integer     0
SQL> select A.sid, b.serial#,
  2    decode(A.type,
  3        'MR', 'Media Recovery',
  4        'RT','Redo Thread',
  5        'UN','User Name',
  6        'TX', 'Transaction',
  7        'TM', 'DML',
  8        'UL', 'PL/SQL User Lock',
  9        'DX', 'Distributed Xaction',
 10       'CF', 'Control File',
 11       'IS', 'Instance State',
 12       'FS', 'File Set',
 13       'IR', 'Instance Recovery',
 14       'ST', 'Disk Space Transaction',
 15       'TS', 'Temp Segment',
 16       'IV', 'Library Cache Invalida-tion',
 17       'LS', 'Log Start or Switch',
 18       'RW', 'Row Wait',
 19       'SQ', 'Sequence Number',
 20       'TE', 'Extend Table',
 21       'TT', 'Temp Table',
 22       'Unknown') LockType,
 23   c.object_name,
 24   b.username,
 25   b.osuser,
 26   decode(a.lmode,   0, 'None',
 27               1, 'Null',
 28               2, 'Row-S',
 29               3, 'Row-X',
 30               4, 'Share',
 31               5, 'S/Row-X',
 32               6, 'Exclusive', 'Unknown') LockMode,
 33   B.MACHINE,D.SPID
 34   from v$lock a,v$session b,all_objects c,V$PROCESS D
 35   where a.sid=b.sid and a.type in ('TM','TX')
 36   and c.object_id=a.id1
 37   AND B.PADDR=D.ADDR;

未选定行

在另一个SESSION:

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\ibsadmin>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 8月 16 17:52:55 2012

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create table t (cloa int);

表已创建。

SQL> insert into t values(1);

已创建 1 行。

 

SQL>

回到原来的session:
SQL> set timing on
SQL> truncate table t;
truncate table t
               *
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效


已用时间:  00: 00: 00.10
SQL>  select A.sid, b.serial#,
  2     decode(A.type,
  3         'MR', 'Media Recovery',
  4         'RT','Redo Thread',
  5         'UN','User Name',
  6         'TX', 'Transaction',
  7         'TM', 'DML',
  8         'UL', 'PL/SQL User Lock',
  9         'DX', 'Distributed Xaction',
 10        'CF', 'Control File',
 11        'IS', 'Instance State',
 12        'FS', 'File Set',
 13        'IR', 'Instance Recovery',
 14        'ST', 'Disk Space Transaction',
 15        'TS', 'Temp Segment',
 16        'IV', 'Library Cache Invalida-tion',
 17        'LS', 'Log Start or Switch',
 18        'RW', 'Row Wait',
 19        'SQ', 'Sequence Number',
 20        'TE', 'Extend Table',
 21        'TT', 'Temp Table',
 22        'Unknown') LockType,
 23    c.object_name,
 24    b.username,
 25    b.osuser,
 26    decode(a.lmode,   0, 'None',
 27                1, 'Null',
 28                2, 'Row-S',
 29                3, 'Row-X',
 30                4, 'Share',
 31                5, 'S/Row-X',
 32                6, 'Exclusive', 'Unknown') LockMode,
 33    B.MACHINE,D.SPID
 34    from v$lock a,v$session b,all_objects c,V$PROCESS D
 35    where a.sid=b.sid and a.type in ('TM','TX')
 36    and c.object_id=a.id1
 37    AND B.PADDR=D.ADDR;

       SID    SERIAL# LOCKTYPE                    OBJECT_NAME
---------- ---------- --------------------------- ------------------------------

USERNAME                       OSUSER                         LOCKMODE
------------------------------ ------------------------------ ---------
MACHINE
----------------------------------------------------------------
SPID
------------------------
        31       1615 DML                         T
SYS                            115-DTHVM\ibsadmin             Row-X
WORKGROUP\115-DTHVM
3748


已用时间:  00: 00: 00.18
SQL> alter session set ddl_lock_timeout = 5;

会话已更改。

已用时间:  00: 00: 00.01
SQL> truncate table t;
truncate table t
               *
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效


已用时间:  00: 00: 05.01

另一个SESSION提交数据:

回到原来 session执行:
SQL> truncate table t;

表被截断。

已用时间:  00: 00: 03.14
SQL>

虽然不能保证每次都成功,但完全可以增加成功的机率!

 

 

 

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值