由于数据库中有一个日志表记录7000万条日志,造成数据库占用磁盘283G之多,所以现在要求给磁盘瘦身,但是直接用DELETE语句删除,不能释放空间,经过查资料学习,得知这是"HWM"(高水位)造成.经过查找资料总结解决方案有两种.

一 彻底删除表(没测试,因为不符合我的情况)

flashback table tablename1 to before drop rename to tablename2;--【to test3】将表重命名

drop table tablename2 purge; --彻底删除表

二、清除表中的数据

        ① 使用truncate(没测试)

        truncate删除不用加条件,直接删除数据,不可找回数据,也不能有外键关联,如果有外键关联,先取消关联,然后在删除,truncate table  tablename1

Truncate不支持回滚,并且不能truncate一个带有外键的表,如果要删除首先要取消外键,然后再删除。

truncate table 后,有可能表空间仍没有释放,可以使用如下语句:

alter table 表名称 deallocate   UNUSED KEEP 0;

注意如果不加KEEP 0的话,表空间是不会释放的。

例如:

alter table F_MINUTE_TD_NET_FHO_B7 deallocate   UNUSED KEEP 0;

或者:

TRUNCATE TABLE (schema)table_name DROP(REUSE) STORAGE才能释放表空间。

例如: truncate table  test1 DROP STORAGE;

引自:

https://www.cnblogs.com/sl-shilong/p/3625153.htmlhttps://www.cnblogs.com/sl-shilong/p/3625153.htmlhttps://www.cnblogs.com/sl-shilong/p/3625153.html

 ②DELETE数据(本人使用)

        因为是日志,所以我想留最近一个月的数据,所以不能直接删表,当然也可以把表中要保留的数据备份,然后操作①中的操作,但是我还是选择了古老的方法.但是DELETE删除后是可以找回数据,为什么可以找回数据,那就是因为数据又存到了另外一个地方,就类似电脑中的回收站,要把回收站清空才能释放空间.

a:  move (引自:oracle删除数据释放表空间流程_诚的博客-CSDN博客_oracle释放表空间)

优点:可以移动表到其他表空间,在执行命令时不需要执行alter table table_name enable row movement

缺点:表move 会导致表中的索引失效,要rebuild;同时表会产生行级锁......;在此如果表中有LOB字段 时要用一下命令来实现表空间移动:alter table owner.table_name move tablespace tablespace_name lob (lob_column) store as lob segment  tablespace tablespace_name;也可以单独move lob,index要rebuild

b:shrink space (引自:oracle删除数据释放表空间流程_诚的博客-CSDN博客_oracle释放表空间)

优点:降低高水位时索引不会失效

缺点:不能将表移动到其他表空间;高水位降低效果没有move明显;同时在执行命令前要先执行(alter table table_name enable row movement允许行移动)也会表会产生行级锁.......,shrink比move更耗费cpu,产生很多current block这样生成巨大的redo与undo 如果表中索引很少可以建议使用move降低高水位
 

shrink space常用操作命令(引自:Oracle 删除数据后释放数据文件所占磁盘空间_ulvge0的博客-CSDN博客)

下面的语句也是本人使用的语句,亲测有效

alter table tablename enable row movement;--打开行移动

alter table tablename shrink space cascade;--压缩表及相关数据段,并下调HWM

alter table tablename shrink sapce compact;--只压缩,不下调HWM

alter table tablename shrink sapce ;--下调HWM

alter table tablename disable row movement;--关闭行移动

如有不对,请多多指教

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐