SQL> select * from v$version ;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
create table t (id number,name varchar2(10));
create index i_t_id on t(id);
insert into t select rownum id ,'test' name from dual connect by level <=100;
commit ;
SQL> select * from v$mystat where rownum<=1;
SID STATISTIC# VALUE
---------- ---------- ----------
133 0 0
insert into t values (101,'a');
SQL> select * from v$mystat where rownum<=1;
SID STATISTIC# VALUE
---------- ---------- ----------
192 0 0
alter index i_t_id rebuild online ;
SQL> host cat viewlock.sql
SELECT lk.SID, se.username, se.osuser, se.machine,
DECODE (lk.TYPE, 'TX', 'Transaction', 'TM', 'DML', 'UL', 'PL/SQL User Lock', lk.TYPE) lock_type,
DECODE (lk.lmode,
0, 'None',
1, 'Null',
2, 'Row-S (SS)',
3, 'Row-X (SX)',
4, 'Share',
5, 'S/Row-X (SSX)',
6, 'Exclusive',
TO_CHAR (lk.lmode)
) mode_held,
DECODE (lk.request,
0, 'None',
1, 'Null',
2, 'Row-S (SS)',
3, 'Row-X (SX)',
4, 'Share',
5, 'S/Row-X (SSX)',
6, 'Exclusive',
TO_CHAR (lk.request)
) mode_requested,
TO_CHAR (lk.id1) lock_id1, TO_CHAR (lk.id2) lock_id2, ob.owner, ob.object_type, ob.object_name,
DECODE (lk.BLOCK, 0, 'No', 1, 'Yes', 2, 'Global') BLOCK, se.lockwait
FROM v$lock lk, dba_objects ob, v$session se
WHERE lk.TYPE IN ('TX','TM','UL') AND lk.SID = se.SID AND lk.id1 = ob.object_id(+);
SQL> @viewlock ;
SID USERNAME OSUSER MACHINE LOCK_TYPE MODE_HELD MODE_REQUE LOCK_ID1 LOCK_ID2 OWNER OBJECT_TYP OBJECT_NAME BLOCK LOCKWAIT
------ ---------- ---------- ---------- ------------ ---------- ---------- ---------- ---------- ------ ---------- -------------------- ----- --------------------
192 SCOTT oracle11g hisdg DML Share None 101683 0 SCOTT TABLE SYS_JOURNAL_101585 No 00000000DFC524D0
192 SCOTT oracle11g hisdg DML Row-S (SS) None 101584 0 SCOTT TABLE T No 00000000DFC524D0
133 SCOTT oracle11g hisdg DML Row-X (SX) None 101584 0 SCOTT TABLE T No
133 SCOTT oracle11g hisdg Transaction Exclusive None 655364 6348 Yes
192 SCOTT oracle11g hisdg Transaction None Share 655364 6348 No 00000000DFC524D0
192 SCOTT oracle11g hisdg Transaction Exclusive None 589841 7146 No 00000000DFC524D0
6 rows selected.
SQL> select * from v$mystat where rownum<=1;
SID STATISTIC# VALUE
---------- ---------- ----------
70 0 0
SQL> select * from SYS_JOURNAL_101585;
no rows selected
SQL> insert into t values (103,'c');
1 row created.
--上次提到回话3并没有挂起!而是正常执行。
SQL> @viewlock
SID USERNAME OSUSER MACHINE LOCK_TYPE MODE_HELD MODE_REQUE LOCK_ID1 LOCK_ID2 OWNER OBJECT_TYP OBJECT_NAME BLOCK LOCKWAIT
------ ---------- ---------- ---------- ------------ ---------- ---------- ---------- ---------- ------ ---------- -------------------- ----- --------------------
192 SCOTT oracle11g hisdg DML Share None 101683 0 SCOTT TABLE SYS_JOURNAL_101585 No 00000000DFC524D0
192 SCOTT oracle11g hisdg DML Row-S (SS) None 101584 0 SCOTT TABLE T No 00000000DFC524D0
133 SCOTT oracle11g hisdg DML Row-X (SX) None 101584 0 SCOTT TABLE T No
70 SCOTT oracle11g hisdg DML Row-X (SX) None 101584 0 SCOTT TABLE T No
133 SCOTT oracle11g hisdg Transaction Exclusive None 655364 6348 Yes
192 SCOTT oracle11g hisdg Transaction None Share 655364 6348 No 00000000DFC524D0
70 SCOTT oracle11g hisdg Transaction Exclusive None 327685 7460 No
192 SCOTT oracle11g hisdg Transaction Exclusive None 589841 7146 No 00000000DFC524D0
8 rows selected.
SQL> select * from SYS_JOURNAL_101585;
C0 O PARTNO RID
---------- - ---------- ------------------
103 I 0 D/////AAEAAAACmAAB
--检查IOT表可以发现记录一条记录。
SQL> commit ;
Commit complete.
SQL> select * from SYS_JOURNAL_101585;
C0 O PARTNO RID
---------- - ---------- ------------------
103 I 0 D/////AAEAAAACmAAB
SQL> select * from SYS_JOURNAL_101585;
C0 O PARTNO RID
---------- - ---------- ------------------
102 I 0 D/////AAEAAAACmAAB
103 D 0 D/////AAEAAAACmAAB
SQL> update t set id=999,name='z' where id=100;
1 row updated.
SQL> select * from SYS_JOURNAL_101585;
C0 O PARTNO RID
---------- - ---------- ------------------
100 D 0 D/////AAEAAAAClABj
102 I 0 D/////AAEAAAACmAAB
103 D 0 D/////AAEAAAACmAAB
999 I 0 D/////AAEAAAAClABj
--再次看出索引的修改相当于 delete+insert.
commit;
delete from SYS_JOURNAL_101585 where rid='D/////AAEAAAAClABj';
SQL> @viewlock ;
SID USERNAME OSUSER MACHINE LOCK_TYPE MODE_HELD MODE_REQUE LOCK_ID1 LOCK_ID2 OWNER OBJECT_TYP OBJECT_NAME BLOCK LOCKWAIT
------ ---------- ---------- ---------- ------------ ---------- ---------- ---------- ---------- ------ ---------- -------------------- ----- --------------------
70 SCOTT oracle11g hisdg DML None Row-X (SX) 101686 0 SCOTT TABLE SYS_JOURNAL_101585 No 00000000DCB9C248
192 SCOTT oracle11g hisdg DML Share None 101686 0 SCOTT TABLE SYS_JOURNAL_101585 Yes 00000000DFC52670
133 SCOTT oracle11g hisdg DML Row-X (SX) None 101584 0 SCOTT TABLE T No
192 SCOTT oracle11g hisdg DML Row-S (SS) None 101584 0 SCOTT TABLE T No 00000000DFC52670
133 SCOTT oracle11g hisdg Transaction Exclusive None 393224 8268 Yes
192 SCOTT oracle11g hisdg Transaction None Share 393224 8268 No 00000000DFC52670
192 SCOTT oracle11g hisdg Transaction Exclusive None 196617 7070 No 00000000DFC52670
7 rows selected.
SQL> alter index i_t_id rebuild online ;
alter index i_t_id rebuild online
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
SQL> select * from SYS_JOURNAL_101585;
C0 O PARTNO RID
---------- - ---------- ------------------
100 D 0 D/////AAEAAAAClABj
102 I 0 D/////AAEAAAACmAAB
103 D 0 D/////AAEAAAACmAAB
999 I 0 D/////AAEAAAAClABj
SQL> alter index i_t_id rebuild online ;
alter index i_t_id rebuild online
*
ERROR at line 1:
ORA-08104: this index object 101585 is being online built or rebuilt
$ oerr ORA 8104
08104, 00000, "this index object %s is being online built or rebuilt"
// *Cause: the index is being created or rebuild or waited for recovering
// from the online (re)build
// *Action: wait the online index build or recovery to complete
SQL> drop table SYS_JOURNAL_101585;
Table dropped.
SQL> alter index i_t_id rebuild online ;
alter index i_t_id rebuild online
*
ERROR at line 1:
ORA-08104: this index object 101585 is being online built or rebuilt--可以发现即使删除 SYS_JOURNAL_101585 IOT表,在rebuild online时一样报错!why?该如何解决呢?
SQL> select sys.dbms_repair.online_index_clean(101585) from dual;
select sys.dbms_repair.online_index_clean(101585) from dual
*
ERROR at line 1:
ORA-06552: PL/SQL: Statement ignored
ORA-06553: PLS-382: expression is of wrong type
function online_index_clean(
object_id IN binary_integer DEFAULT ALL_INDEX_ID,
wait_for_lock IN binary_integer DEFAULT LOCK_WAIT)
return boolean;
-- Example Usage of online_index_clean:
-- DECLARE
-- isClean BOOLEAN;
-- BEGIN
--
-- isClean := FALSE;
-- WHILE isClean=FALSE
-- LOOP
-- isClean := DBMS_REPAIR.ONLINE_INDEX_CLEAN(DBMS_REPAIR.ALL_INDEX_ID,
-- DBMS_REPAIR.LOCK_WAIT);
-- DBMS_LOCK.SLEEP(10);
-- END LOOP;
--
-- EXCEPTION
-- WHEN OTHERS THEN
-- RAISE;
-- END;
-- /
DECLARE
isClean BOOLEAN;
BEGIN
isClean := FALSE;
isClean := DBMS_REPAIR.ONLINE_INDEX_CLEAN(101585,DBMS_REPAIR.LOCK_WAIT);
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
/
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-739206/ ,如需转载,请注明出处,否则将追究法律责任。