美文网首页攻城狮拽拽
关于ORACLE数据库delete后释放空间问题

关于ORACLE数据库delete后释放空间问题

作者: 拽拽很乖 | 来源:发表于2018-05-04 10:22 被阅读0次

            前些天给一家客户开发个接口,还原了正式数据库,由于数据库存储量太大,还原后基本没什么空间了,有个业务表使用频繁,决定删除前期数据,只留近两个月数据以便测试。

            数据量太大,等待时间长,就分段删除的,删了一半左右吧,发现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后释放空间问题

        本文链接:https://www.haomeiwen.com/subject/phtdrftx.html