执行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>
虽然不能保证每次都成功,但完全可以增加成功的机率!