记一次Oracle数据库shrink回收高水位表报错ORA-10631解决过程

概述

今天在对某个表做高水位回收的时候发现回收不了,提示报错:ORA-10631: SHRINK clause should not be specified for this object

报错截图如下:

记一次Oracle数据库shrink回收高水位表报错ORA-10631解决过程


查询得知shrink的使用有很多限制,限制如下:

Shrink operations can be performed only on segments in locally managed tablespaces with automatic segment space management (ASSM). Within an ASSM tablespace, all segment types are eligible for online segment shrink except these:

记一次Oracle数据库shrink回收高水位表报错ORA-10631解决过程

■ IOT mapping tables
■ Tables with rowid based materialized views
■ Tables with function-based indexes
■ SECUREFILE LOBs
■ Compressed tables

简单翻译如下:

Shrink 操作需满足表空间是本地管理和自动段空间管理(10g、11g默认就是这样),以下情况不能用shrink:

IOT索引组织表

用rowid创建的物化视图的基表

带有函数索引的表

SECUREFILE 大对象

压缩表

检查报错的表

记一次Oracle数据库shrink回收高水位表报错ORA-10631解决过程

检查DPCA_LJPL_XX_LJYHXX 的索引果然有函数索引,属于带有函数索引的表,

所以shrink导致报了ORA-10631错误。这里只能选择move来回收了。


相比alter table move,Shrink的进步是:

1.可在线执行

2.可使用参数cascade,同时收缩表上的索引

3.执行后不会导致索引失效

4.可避免alter table move执行过程中占用很多变空间(如果表10G大小,那alter table move差不多还得需要10G空间才能执行)。


这里主要讲shrink虽然好用,但还是有一些限制存在,需要多多注意!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

记一次Oracle数据库shrink回收高水位表报错ORA-10631解决过程

相关推荐