Shrink方式
从10g开始,Oracle开始提供Shrink的命令,假如我们的表空间中支持自动段空间管理(ASSM),就可以使用这个特性缩小段,即降低HWM。这里需要强调一点,10g的这个新特性,仅对ASSM表空间有效,否则会报 ORA-10635: Invalid segment or tablespace type。
一、segment shrink大概分为两个阶段:
1、数据重组(compact):通过一系列insert、delete操作,将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。
2、HWM调整:第二阶段是调整HWM位置,释放空闲数据块。此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。
二、使用方法
1、使用前提
更新统计信息
因为所有的信息都是根据dba_tables,表的信息是根据统计信息得到的,所以如果统计信息不准确,那么整个搜索的结果都可能是错误的;
统计信息的脚本:exec dbms_stats.gather_table_stats('user','table_name');
开启动行移动
在使用shrink功能时,必须对表开启动行移动功能
alter table <table_name> enable row movement ;
2、语法
alter table <table_name> shrink space [ <null> | compact | cascade ];
alter table <table_name> shrink space 两个阶段都执行。收缩表,降低 high water mark
alter table <table_name> shrink space compcat 只执行第一个阶段。收缩表,但会保持 high water mark
alter table <table_name> shrink space cascade 两个阶段都执行。收缩表,降低 high water mark,并且相关索引也会收缩。
注意:如果系统业务比较繁忙,可以先执行shrink space compact重组数据,然后在业务不忙的时候再执行shrink space降低HWM释放空闲数据块。
3、检查HWM方法
select
a.file_id,
a.file_name,
a.filesize,
b.freesize,
(a.filesize - b.freesize) usedsize,
c.hwmsize,
c.hwmsize - (a.filesize - b.freesize) can_shrink_hwm_size,
a.filesize - c.hwmsize can_shrink_filesize
from
(select file_id,file_name,round(bytes/1024/1024) filesize from dba_data_files) a,
(select file_id,round(sum(bytes)/1024/1024) freesize from dba_free_space group by file_id) b,
(select file_id,round(max(block_id)*8/1024) hwmsize from dba_extents where tablespace_name='CANCER' group by file_id) c
where a.file_id = b.file_id and a.file_id=c.file_id;
shrink注意:
1. move时产生的日志比shrink时少.参看http://blog.csdn.net/huang_xw/article/details/7016365
2. shrink在移动行数据时,也一起维护了index上相应行的数据rowid的信息,当然shrink过程中用来维护index的成本也会比较高。而表move后index的状态是UNUSABLE的,需要进行rebuild。参见http://blog.csdn.net/huang_xw/article/details/7016415
3. oracle是从后向前移动行数据,那么,shrink的操作就不会像move一样,shrink不需要使用额外的空闲空间。
Move方式
执行表重建指令 alter table table_name move tablespace tablespace_name(验证不可行,不降低水位线,但可释放表空间),可以将表空间进行resize以后,再将对象move回来,可以降低水位线。
Move后会引发索引失效记得重建索引
查询失效索引语句:
select 'alter index '||index_name||' rebuild tablespace '||tablespace_name||';' from dba_indexes where owner='owner_name' and status<>'VALID';
重建索引语句:将上述语句执行查询的结果执行即可。
Exp方式
将占用高水位的对象用exp导出后,将对象在彻底删除后,resize表空间大小,再将导出的文件重新imp即可。或者全部导出exp,删除表空间重建,再imp也可。
————————————————
版权声明:本文为CSDN博主「梓沐」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011364306/article/details/49103343