早上帮朋友看一个服务器(测试环境)、Oralce装在了/home/oracle下面。。一共就40多G现在全用满了,数据库现在连不上了。
去目录里面看了看,清了清alter和trace文件夹里日志(我喜欢用du -sh * 一步步往下定位),然而也没释放多少。
看了下数据文件,system01.dbf 17个G了... undo表空间也4个多G
先给他建了个新undo,然后切过去,然后把老undo删了(虽然删了,但是直到重启库后操作系统的空间才释放出来)
然后查了一下system表空间的情况,发现最大的是aud$,应该是开着审计呢,show parameter audit_trail 看了一下是DB,于是alter system set audit_trail=NONE scope=spfile 把它关了
然后aud$这个表也是直接truncate了。
然后就怎么考虑把这个dbf大小降下去,网上查了查,好像只能resize。
select max(block_id)*8/1024/1024 'G' from dba_extents where file_id=xxx;查了一下,然后按照这个查出来的结果resize
这个dbf其实没有resize太多。就往下降了2G多,其实现在这个dbf里还是有绝大部分的块是unused,但是没办法,max block_id摆在那。。其实最好的办法是把这个库重建了
整完之后,我就去网上查看然后整理总结了一下表和表空间的回收、收缩的一些知识点,如下:
alter table xxx shrink space:
收缩表,降低高水位线
前提:
1.只对ASSM(Auto Segment Space Management)表空间有效
2.需开始行移动alter table xxx enable row movement(开启行移动会照成引用表的数据库对象失效);
3.以下情况不能用shrink:IOT索引组织表、用rowid创建的物化视图的基表、带有函数索引的表、SECUREFILE 类型的大对象、压缩表
该语句执行分为两个阶段:
1.数据重组(compact):将数据尽量排在段的前面,需要开启行移动且禁用基于rowid的相关的触发器,alter table xxx shrink space compact命令可以只执行这一步骤,过程中会加行级X锁,有一种聚合的感觉
2.HWM调整:降低高水位,释放空闲数据块,过程中会加表级X锁
alter table xxx shrink space cascade:连同表的级联对象一起整理(比如索引)
alter index xxx shrink space:收缩索引
alter table xxx move(tablespace xxxx):
收缩或者迁移表,相当于是把表拿到另一个地方(本表空间或者其他表空间),然后重新构建和组织表,达到减少存储碎片、降低HWM的效果
需要额外的存储空间、move后索引需要rebuild,执行的时候也是表级X锁
alter database datafile 'xxx' resize xx:
收缩数据文件大小(物理层面),从操作系统的存储空间中可以直观的看出效果
resize的大小参考 select max(block_id)*8/1024/1024 'G' from dba_extents where file_id=xxx;这个值