关于ORACLE数据库delete后释放空间问题前些天给⼀家客户开发个接⼝,还原了正式数据库,由于数据库存储量太⼤,还原后基本没什么空间了,有个业务表使⽤频繁,决定删除前期数据,只留近两个⽉数据以便测试。数据量太⼤,等待时间长,就分段删除的,删了⼀半左右吧,发现delete掉数据后空间不但没收缩,⽽且占⽤的存储空间还越来越⼤,于是乎决定看下怎么回事。⾸先查了下表空间占⽤率:
select total.tablespace_name,Round(total.MB,2) as Total_MB, Round(total.MB-free.MB,2) as Used_MB, Round((1-free.MB/total.MB)*100,2) || ‘%’ as Used_Rctfrom (select tablespace_name,Sum(bytes)/1024/1024 as MB from dba_free_space group by tablespace_name) free, (select tablespace_name,Sum(bytes)/1024/1024 as MB from dba_data_files group by tablespace_name) totalWHERE free.tablespace_name = total.tablespace_name;
发现UNDOTBS1这个表空间占了32G的存储空间,百度了下才知道这个是回滚段表空间,事物恢复、记录些⽇志什么的。知道⽤途后就放⼼删除了。
1、创建新的表空间:
create undo tablespace undotbs2 datafile ‘/oradata/ddptest/UNDOTBS1_01.dbf’ size 100m reuse autoextend on next 100m maxsize unlimited;
2、更改splife配置:alter system set undo_tablespace=undotbs2 scope=both;
3、删除原表空间:drop tablespace undotbs2 including contents;
4、创建pfile:create pfile from spfile;这时发现存储空间并没有减少,重新查了下表空间占⽤率,已经没有UNDOTBS1的记录了,能查到UNDOTBS2的占⽤率。索性停掉oracle服务,直接去路径delete掉表空间,瞬间多了30多G空间。于是继续删除数据,删除了⼤半天终于删完了,回滚段表空间⼜重新建了⼀次,但是数据表空间占⽤率并没有下降。
⼿动释放表空间:
alter table tableName enable row movement;alter tabletableName shrink space;表空
间占⽤率⼀下⼦就降下来了。(清除回滚段表空间⼀定要慎重,尽量不要在正式数据库操作!)