当前位置:首页 > Oracle > 正文内容

Oracle 降低高水位的方法

管理员2年前 (2018-05-21)Oracle200

在很多系统运行多年以后,会把历史业务数据归档的需求,常见于把大量历史数据拆分到另一张新表中,并在原表中删除,实际上,业务数据被迁移到新表之后,原来的表所占的空间并不会主动释放,这时就需要人为的干预,这里提供3种方法,各有利弊。

移动表

用move 操作表实际上执行的 ctas 操作。

alter table test move;
alter table test move tablespace mytbs;
alter index ix_test rebuild;

不足:如果表上存在索引,这些索引就会失效,必须重建,消耗的时间较长;

优点:1. 可以把数据移动到其他的表空间,也可以在保留在原表空间内;2. 不停机,但是操作时可能会有短暂的卡顿。

收缩表

在收缩表之前,要求启用表的“行迁移”特性,这个特性每张表只需要启用一次即可,或者在创建表时,可以直接指定 enable row movement 选项,shrink space 只能在原表空间内操作,在压缩表时,加 cascade 选项,可以同时收缩表上的索引。

alter table test enable row movement;
alter table test shrink space cascade;

不足:在数据量较大时,不能一次性完且收缩,需要执行多次才能达到预期。

优点:不停机,卡顿不明显。

导入导出方法

可以先把表中的数据导出来,可以采用 exp 方法导出,也可以使用 ctas 方法备份到另一张表,备份完成后,再truncate table 掉原表,这样可以已占用的空间完全收回收,最后再insert select 把备份的数据写回来。

create table test_bak as select * from test;
truncate table test;
insert into test select * from test_bak;

不足:1. 表上存在外键,必要把先把外键删除或禁用;2. 从截断本表到数据写回,会有短暂的停机;3. 在insert 之前须禁用触发器,待数据回写完成,再重新启用。

优点:操作速度要快于前两种。

打赏 支付宝打赏 微信打赏
    扫描二维码至手机访问

    扫描二维码推送至手机访问。

    版权声明:本文由卖水果的net发布,如需转载请注明出处。

    转载请注明出处:http://www.msgde.net/oracle/oracle_clean_hwm.html

    标签: ctas
    分享给朋友:

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。