Oracle之降低高水位线

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值