ORA-02429: 无法删除用于强制唯一/主键的索引

本文介绍了解决Oracle数据库中因删除大表后导致的空间浪费问题的方法,包括如何移动表以降低block_id值、处理含有long类型字段的表以及删除用于强制唯一/主键约束的索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORA-02429: 无法删除用于强制唯一/主键的索引 (2008-06-18 15:52:49)
标签:it 分类:ora错误分析

操作:
因为drop 掉了一个2千万记录的大表,现在想收缩其原来所在的表空间的数据文件,但是由于有些小记录的表是create在大表之后的,所以需要移动这些小表,通过dba_extents查到这些在高水位空间上的表


SQL> select segment_name,file_id,extent_id,block_id,bytes
2 from dba_extents
3 where file_id in (11,12,14,15,18)
4 order by file_id,extent_id;
SEGMENT_NAME FILE_ID EXTENT_ID BLOCK_ID BYTES
---------------------- ---------- ---------- ---------- ----------
IND_T1_N1_V1 11 0 1081 65536
FY_2004_2 11 3 1033 65536
FY_2004_2 11 8 1041 65536
PK_1 12 0 1089 65536
SYS_C003155 12 0 1105 65536
SYS_C003159 12 0 1113 65536
FY_2004_2 12 4 1049 65536
FY_2004_2 12 9 1057 65536
PLAN_TABLE 14 0 35513 65536
FY_2004_2 14 0 35481 65536
FY_2004_2 14 5 35489 65536
FY_2006 15 0 38313 65536
EMP_TEST 15 0 38361 65536
IND_T1_N1 15 0 38377 65536
CHAINED_ROWS 15 0 1297 65536
FY_2006_IND 15 0 38369 65536
SYS_C003157 15 0 38321 65536
FY_2004_2 15 1 1177 65536
FY_2004_2 15 6 1185 65536
TESTA2 18 0 1225 65536
TEMP_T2 18 0 1209 65536
T1 18 0 1185 65536
T2 18 0 1193 65536
T_TESTSQL 18 0 1241 65536
USER_NOTICE 18 0 1249 65536
TESTA 18 0 1217 65536
PRI_TAB 18 0 1177 65536
FY_2004_2 18 2 1161 65536
FY_2004_2 18 7 1169 65536

已选择29行。

可以看到象fy_2004_2,plan_table,sys_c003157等对象的block_id都比较大,说明都在相应数据文件比较高水位的地方,象fy_2004_2这个表及索引fy_2006_ind等不需要的对象,我可以直接drop掉,对plan_table等需要保留的表进行move

SQL> alter table plan_table move;

alter table plan_table move

ORA-00997: 非法使用 LONG 数据类型

因为plan_table里出现字段为long类型,所以出错,解决办法请点击这里

move成功后再查看dba_extents 表

SQL> /

SEGMENT_NAME FILE_ID EXTENT_ID BLOCK_ID BYTES
---------------------- ---------- ---------- ---------- ----------
IND_T1_N1_V1 11 0 1081 65536
PK_1 12 0 1089 65536
SYS_C003155 12 0 1105 65536
SYS_C003159 12 0 1113 65536
FY_2006 15 0 1177 65536
SYS_IL0000030377C00026$$ 15 0 1169 65536
SYS_LOB0000030377C00026$$ 15 0 1161 65536

SYS_C003157 15 0 38321 65536
EMP_TEST 15 0 1185 65536
PLAN_TABLE 15 0 1201 65536
CHAINED_ROWS 15 0 1297 65536
TESTA2 18 0 1225 65536
TEMP_T2 18 0 1209 65536
T1 18 0 1185 65536
T2 18 0 1193 65536
T_TESTSQL 18 0 1241 65536
USER_NOTICE 18 0 1249 65536
TESTA 18 0 1217 65536
PRI_TAB 18 0 1177 65536

已选择19行。
move成功,plan_table的block_id变小了

还有一个索引sys_c003157,目前不知道是函数索引或分区索引还是主键索引,我们先删除一下试试

SQL> drop index sys_c003155;

drop index sys_c003155

ORA-02429: 无法删除用于强制唯一/主键的索引

查一查

SQL> select index_name,column_name,table_name from user_ind_columns;

INDEX_NAME COLUMN_NAME TABLE_NAME
------------------------------ ---------------------- ------------------------------
FY_2006_IND ID FY_2006
PK_1 PRI_1 PRI_TAB
IND_T1_N1 N2 T1
IND_T1_N1_V1 N2 T1
IND_T1_N1_V1 V1 T1
SYS_C003157 PARTID TAB_PART_HASH
SYS_C003155 PARTID TAB_PART_RANGE
IND_PART_RANGE PARTDESC TAB_PART_RANGE
SYS_C003159 PARTID TAB_PART_RANGE_HASH

9 rows selected

我们看到应该是属于主键索引

SQL> select owner,constraint_name,constraint_type,table_name,search_condition
2 from user_constraints;

OWNER CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME SEARCH_CONDITION
------ ------------------ --------------- -------------------- -------------------------------
IC SYS_C003151 C PRI_TAB "PRI_2" IS NOT NULL
IC SYS_C003152 C PRI_TAB pri_3 in ('M','F')
IC PK_1 P PRI_TAB
IC SYS_C003156 C TAB_PART_HASH "PARTDATE" IS NOT NULL
IC SYS_C003157 P TAB_PART_HASH
IC SYS_C003154 C TAB_PART_RANGE "PARTDATE" IS NOT NULL
IC SYS_C003155 P TAB_PART_RANGE
IC SYS_C003159 P TAB_PART_RANGE_HASH
IC SYS_C003148 C USER_NOTICE "CONTENT" IS NOT NULL
IC SYS_C003149 C USER_NOTICE "ISRED" IS NOT NULL
IC SYS_C003150 C USER_NOTICE "ISSHOW" IS NOT NULL
IC SYS_C003147 V V_T1_2

11 rows selected

SQL> alter table tab_part_hash drop constraint sys_c003157;

Table altered

再查一查dba_data_files

SQL> /

SEGMENT_NAME FILE_ID EXTENT_ID BLOCK_ID BYTES
---------------------- ---------- ---------- ---------- ----------
IND_T1_N1_V1 11 0 1081 65536
PK_1 12 0 1089 65536
SYS_C003159 12 0 1113 65536
SYS_C003155 12 0 1105 65536
FY_2006 15 0 1177 65536
SYS_LOB0000030377C00026$$ 15 0 1161 65536
SYS_IL0000030377C00026$$ 15 0 1169 65536
EMP_TEST 15 0 1185 65536
PLAN_TABLE 15 0 1201 65536
CHAINED_ROWS 15 0 1297 65536
TESTA2 18 0 1225 65536
TEMP_T2 18 0 1209 65536
T1 18 0 1185 65536
T2 18 0 1193 65536
T_TESTSQL 18 0 1241 65536
USER_NOTICE 18 0 1249 65536
TESTA 18 0 1217 65536
PRI_TAB 18 0 1177 65536

已选择18行。

看来大工告成了,现在可以缩小 表空间 ic_data里的数据文件了

SQL> alter database datafile 15 resize 15m;

Database altered

.........

以上在网上找到的

我自己解决问题如下

alter table fin_ord_ref drop constraint fin_ord_ref_p;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值