oracle truncateb表后 表空间释放问题的解决办法

来源:互联网 发布:mac上推荐的文艺软件 编辑:程序博客网 时间:2024/05/22 05:31

检查数据库表空间时,发现有的表空间使用率很大,但是库里又没数据。搜索整理下,如何释放表空间 已syjk_data表空间为例

 查看表空间大小

select a.tablespace_name, round(a.total_size) "total_size(MB)",round(a.total_size)-round(b.free_size,3) "used_size(MB)",round(b.free_size,3) "free_size(MB)", round(b.free_size/total_size*100,2)||'%' free_ratefrom ( select tablespace_name, sum(bytes)/1024/1024 total_size       from dba_data_files       group by tablespace_name ) a,       ( select tablespace_name, sum(bytes)/1024/1024 free_size         from dba_free_space         group by tablespace_name ) b       where a.tablespace_name = b.tablespace_name(+);


TABLESPACE_NAMETOTAL_SIZE USED_SIZE FREE_SIZE FREE_RATESYJK_HISTORY1024011023999.99%SYJK_MODEL1024011023999.99%SYFX_SYSTEM1024011023999.99%SYFX_MODEL1024011023999.99%SYJK_SYSTEM1024011023999.99%USERS51.3123.68873.75%SYJK_UNDO102402.2510237.7599.98%UNDOTBS1614444.4376099.56399.28%SYSTEM700692.757.251.04%SYSAUX800746.12553.8756.73%SYJK_INDEX102407118.0623121.93830.49%SYJK_DATA204808130.06212349.93860.3%
释放后表空间的大小

TABLESPACE_NAMETOTAL_SIZE USED_SIZE FREE_SIZE FREE_RATESYJK_HISTORY1024011023999.99%SYJK_MODEL1024011023999.99%SYFX_SYSTEM1024011023999.99%SYFX_MODEL1024011023999.99%SYJK_SYSTEM1024011023999.99%USERS51.3123.68873.75%SYJK_UNDO102402.2510237.7599.98%SYJK_DATA2048020.87520459.12599.9%UNDOTBS1614444.4376099.56399.28%SYSTEM700692.757.251.04%SYSAUX800746.12553.8756.73%SYJK_INDEX102407118.0623121.93830.49%

一、truncate用法
1.删除表中所有的行,释放数据所占用的自由空间

同时删除索引数据,释放该表上的index所占用的自由空间

truncate table 表名;(会释放空间)

但是,truncate不会释放由minextents storage parameter 指定的存储参数

例如,即便表中没有任何记录,也会占用(initial_extent)3G空间

2.删除表中所有的行,保留表所占用的空间,留待该表下次使用。

TRUNCATE TBALE  表名 REUSE STORAGE;(不会释放空间)

假如你的库是imp/exp导入导出的,并且在之前库中存在数据,也就是(dba_segments中)initial_extent字段的值为当初所占空间的大小(索引也是一样),

执行如下语句,查看

所占表空间大小的表(批量操作)

Select owner, decode(partition_name,              null,              segment_name,              segment_name || ':' || partition_name) objectname ,       'alter ' || segment_type || ' ' ||       decode(partition_name,              null,              segment_name,              segment_name || ':' || partition_name) ||       ' deallocate unused keep 1k  ' scripts,       segment_type objecttype,       nvl(bytes, 0) "SIZE",       nvl(initial_extent, 0) INITIALEXT,       nvl(next_extent, 0) NEXTEXT,       nvl(extents, 0) NUMEXTENTS,       nvl(max_extents, 0) "MAXEXTENTS"  from dba_segments s where tablespace_name  in ('SYJK_DATA','SYJK_INDEX') and owner = 'TPL' and s.segment_type in ('TABLE','INDEX') order by  nvl(bytes, 0) desc  ; 

解决方法,执行以下语句,释放extent

alter TABLE SYJK_CCS_CCSCXCCJBXX deallocate unused keep 1k  
alter TABLE SYJK_CCS_CCSCXRCJBXX deallocate unused keep 1k  
alter TABLE SYJK_CCS_RKMX deallocate unused keep 1k  
alter TABLE SYJK_CCS_CCSXX deallocate unused keep 1k  
alter TABLE IADSYSCONFIG deallocate unused keep 1k