ITPub博客

首页 > 数据库 > Oracle > Oracle之降低高水位线

Oracle之降低高水位线

原创 Oracle 作者:梓沐 时间:2016-02-15 09:44:47 0 删除 编辑

Shrink方式

10g开始,Oracle开始提供Shrink的命令,假如我们的表空间中支持自动段空间管理(ASSM),就可以使用这个特性缩小段,即降低HWM。这里需要强调一点,10g的这个新特性,仅对ASSM表空间有效,否则会报 ORA-10635: Invalid segment or tablespace type

一、segment shrink大概分为两个阶段:

1、数据重组(compact):通过一系列insertdelete操作,将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowidtrigger.这一过程对业务影响比较小。

2HWM调整:第二阶段是调整HWM位置,释放空闲数据块。此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。

二、使用方法

1、使用前提

更新统计信息

因为所有的信息都是根据dba_tables,表的信息是根据统计信息得到的,所以如果统计信息不准确,那么整个搜索的结果都可能是错误的;

统计信息的脚本:exec dbms_stats.gather_table_stats('user','table_name');

开启动行移动

在使用shrink功能时,必须对表开启动行移动功能

alter table enable row movement ;

2、语法

alter table shrink space [ | compact | cascade ];

alter table shrink space 两个阶段都执行。收缩表,降低 high water mark

alter table shrink space compcat 只执行第一个阶段。收缩表,但会保持 high water mark

alter table 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的成本也会比较高。而表moveindex的状态是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也可。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29812844/viewspace-1988804/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
擅长PLS/QL开发,SQL调优和改写,数据库设计

注册时间:2014-08-18

  • 博文量
    161
  • 访问量
    1085906