关于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_Rct

from (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) total

WHERE 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;

表空间占用率一下子就降下来了。

        (清除回滚段表空间一定要慎重,尽量不要在正式数据库操作!)

你可能感兴趣的:(关于ORACLE数据库delete后释放空间问题)