日期:2014-05-16  浏览次数:20408 次

表中含有long字段,如何对表压缩?

表里面有long columns, oracle就不支持回缩了shrink

如果数据库可以停机的话,那么可以用exp/imp来代替解决
不行的话就加磁盘吧

 

shrink 表的一些操作整理

 from 阿里dba组操作文档

一、目的

明确SHRINK TABLE操作的风险及标准流程,最大限度避免SHRINK TABLE操作带来的故障。

二、适用范围

l 优化操作中,为了优化表,分区,LOB的空间

l 操作对象包括:普通表,分区,子分区,LOB字段

l 只针对9i以上的数据库版本

备注:以下不支持shrink操作

             Tables with a LONG column

              on-commit materialized views

                Tables with function-based indexes/bitmap join indexes

SECUREFILE LOBs

Compressed tables

三、风险评估

l ALTER TABLE *** ENABLE/DISABLE ROW MOVEMENT 会使依赖对象失效(10g)

l 不建议直接对表进行shrink space,为了减少锁表时间,先进行shrink space compact 进行空间整理,但不调整HW,然后再对表进行shrink space(注意UNDO空间的消耗)

l  基于表ROWID的物化视图,SHRINK完后需要REBUILD,不然原来的数据的DML操作,通过刷新无法同步

l  属于DDL,不会影响有关TABLE DML 的触发器

l shrink space 操作会阻塞DML和DDL,此时对表采用顺序读,时间根据表而定。

四、操作流程

1. 准备工作

a) 确认shrink space表的持续时间和期间无法操作表(包括查询)的风险,

b) 事先整理完成shrink 表的脚本和编译脚本(10g)

c) 确认原来表的大小@size,方便操作前后对比

d) 明确不能使用shrink space CASCADE操作

2. 执行过程(务必严格按照以下步骤)

a) alter table *** enable row movement

b) compile_dep_obj(only 10g)

c) alter table *** shrink space compact;

or alter table *** modify lob(***)(shrink space compact);

or alter table *** modify partition *** shrink space compact ;

or alter table *** modify partition *** lob(***)(shrink space compact);

d) 查看UNDO消耗 @undo

e) alter table *** shrink space;

or alter table *** modify lob(***)(shrink space);

or alter table *** modify partition *** shrink space;

or alter table *** modify partition *** lob(***)(shrink space);

f) alter table *** disable row movement

g) compile_dep_obj(only 10g)

h) shrink操作期间,查看数据库等待事件@active和锁情况@lock

i) 如果DB是定期收集统计信息的,建议使用REBUILD INDEX和并重新分析表,否则建议只使用SHRINK INDEX COMPACT,SHRINK INDEX操作

3. 验证方案

a) 常规检查:@dbcheck

b) 大小确认:@size

c) 数据库是否正常:@active

五、核心对象风险

不建议使用shrink space操作