问题1:删除表空间期间遭遇报错 ORA-29857
删除表空间语句:DROP TABLESPACE SAC INCLUDING CONTENTS AND DATAFILES;
根据MOS文档:
How To Resolve ORA-29857 During a Drop Tablespace although No Domain Index exists in This Tablespace (文档 ID 1610456.1)
对于ORA-29857这个错误,文档说的很清楚:
现象:
删除表空间时,遇到报错ORA-29857,例如:
SQL> drop tablespace SAC including contents and datafiles
drop tablespace SAC 
including contents and datafiles
*
ERROR at line 
1:
ORA
-29857: 
domain indexes and/
or secondary objects exist 
in the 
tablespace
然而,你并未在这个表空间中发现域索引:
SQL> 
SELECT OWNER,INDEX_NAME, TABLE_OWNER, TABLE_NAME
 
FROM DBA_INDEXES 
WHERE INDEX_TYPE=
'DOMAIN'
 AND TABLESPACE_NAME =
'SAC';
no rows selected
原因:
The table which is in the tablespace to be dropped has a domain index which needs to be dropped before dropping the tablespace.
Domain indexes cannot be created in a specific tablespace and the TABLESPACE_NAME column in DBA_INDEXES is always null for domain indexes.
要删除的表空间中的表有一个域索引,这个域索引在删除表空间前需要被删除掉。
域索引不能被创建在指定的表空间,对于域索引,DBA_INDEXES中的TABLESPACE_NAME列值总是空值。
解决方法:
You need to identify and drop the secondary objects:
你需要找出并删除二级对象:
1.The domain index associated with a table in the tablespace to be dropped can be identified from the following query:
要删除的与在这个表空间中的表相关的域索引可以通过下面的查询找出来:
SQL> 
SELECT INDEX_NAME,I.TABLE_NAME 
FROM DBA_INDEXES I, DBA_TABLES T 
WHERE T.TABLE_NAME=I.TABLE_NAME 
AND T.OWNER=I.OWNER
AND I.INDEX_TYPE=
'DOMAIN'
and t.TABLESPACE_NAME=
'&TABLESPACE_NAME';
2.Secondary objects associated with domain indexes, can be identified from the following query:
与域索引相关的二级对象,可以通过下面的查询找出来:
SQL> 
SELECT SECONDARY_OBJECT_OWNER,SECONDARY_OBJECT_NAME,SECONDARY_OBJDATA_TYPE 
FROM DBA_SECONDARY_OBJECTS 
WHERE INDEX_NAME=
'INDEX_NAME_From_Previous_Query';
Once you identify the secondary objects, you can drop those and then drop the tablespace.
一旦你找出这些二级对象,你就可以删除它们然后再删除表空间。
Please see the following example:
请看下面的例子:
SQL> CREATE TABLESPACE SAC DATAFILE 
'C:\SAC.DBF' SIZE 50M;
Tablespace created.
SQL> CREATE TABLE SAC TABLESPACE SAC 
AS SELECT * 
FROM ALL_OBJECTS;
Table created.
SQL> begin
 ctx_ddl.create_preference(
'SUBSTRING_PREF','BASIC_WORDLIST');
 ctx_ddl.set_attribute(
'SUBSTRING_PREF', 'SUBSTRING_INDEX','TRUE');
 end;
 /
PL/SQL procedure successfully completed.
-- Trying 
to create the domain index 
in specific tablespace fails 
with ORA
-29850:
SQL> CREATE INDEX SAC_INDX 
ON SAC(OBJECT_TYPE) INDEXTYPE 
IS CTXSYS.CONTEXT PARAMETERS (
'WORDLIST SUBSTRING_PREF MEMORY 50M') TABLESPACE SAC;
CREATE INDEX SAC_INDX 
ON SAC(OBJECT_TYPE) INDEXTYPE 
IS CTXSYS.CONTEXT PARAMETERS (
'WORDLIST SUBSTRING_PREF MEMORY 50M') TABLESPACE SAC
*
ERROR at line 
1:
ORA
-29850: invalid 
option for creation 
of domain indexes
SQL> CREATE INDEX SAC_INDX 
ON SAC(OBJECT_TYPE) INDEXTYPE 
IS CTXSYS.CONTEXT PARAMETERS (
'WORDLIST SUBSTRING_PREF MEMORY 50M');
Index created.
SQL> drop tablespace sac including contents 
and datafiles;
drop tablespace sac including contents 
and datafiles
*
ERROR at line 
1:
ORA
-29857: domain indexes 
and/
or secondary objects exist 
in the tablespace
-- Trying 
to find the domain index 
in this tablespace:
SQL> 
SELECT OWNER,INDEX_NAME, TABLE_OWNER, TABLE_NAME
 
FROM DBA_INDEXES 
WHERE INDEX_TYPE=
'DOMAIN'
 AND TABLESPACE_NAME =
'SAC';
no rows selected
--Trying 
to find segments created 
in this newly created tablespace:
SQL> 
SELECT SEGMENT_NAME,SEGMENT_TYPE 
FROM DBA_SEGMENTS 
WHERE TABLESPACE_NAME=
'SAC';
SEGMENT_NAME SEGMENT_TYPE
-------------------- ------------------
SAC TABLE
-- Trying 
to find the segment 
for index SAC_INDX :
SQL> 
SELECT TABLESPACE_NAME 
FROM DBA_SEGMENTS 
WHERE SEGMENT_NAME=
'SAC_INDX';
no rows selected
-- Trying 
to find the tablespace 
for index SAC_INDX 
from DBA_INDEXES :
SQL> 
set null null
SQL> 
select INDEX_TYPE,TABLE_TYPE,DOMIDX_STATUS,DOMIDX_OPSTATUS,SEGMENT_CREATED,TABLESPACE_NAME 
from DBA_INDEXES 
where INDEX_NAME=
'SAC_INDX';
INDEX_TYPE TABLE_TYPE DOMIDX_STATU DOMIDX SEG TABLESPACE_NAME
--------------------------- ----------- ------------ ------ --- ------------------------------
DOMAIN TABLE VALID VALID YES null
--
To find the indexes that are causing ORA
-29857 , please use the following query :
SQL> col TABLE_NAME 
for a30
SQL> col INDEX_NAME 
for a30
SQL> 
SELECT INDEX_NAME,I.TABLE_NAME 
FROM DBA_INDEXES I, DBA_TABLES T
WHERE T.TABLE_NAME=I.TABLE_NAME
 
AND T.OWNER=I.OWNER
 
AND I.INDEX_TYPE=
'DOMAIN'
 and t.TABLESPACE_NAME=
'SAC';
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
SAC_INDX SAC
SQL> DROP INDEX SAC_INDX;
Index dropped.
--confirm that no secondary objects associated 
with domain index still exist:
SQL> 
SELECT SECONDARY_OBJECT_OWNER,SECONDARY_OBJECT_NAME,SECONDARY_OBJDATA_TYPE 
FROM DBA_SECONDARY_OBJECTS 
WHERE INDEX_NAME=
'SAC_INDX';
no rows selected
SQL> DROP TABLESPACE SAC INCLUDING CONTENTS 
AND DATAFILES;
Tablespace dropped.
问题2:删除表空间期间遭遇 ORA-02429