检查数据库表空间时,发现有的表空间使用率很大,但是库里又没数据。搜索整理下,如何释放表空间 已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_rate
from ( 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_NAME TOTAL_SIZE USED_SIZE FREE_SIZE FREE_RATE
SYJK_HISTORY 10240 1 10239 99.99%
SYJK_MODEL 10240 1 10239 99.99%
SYFX_SYSTEM 10240 1 10239 99.99%
SYFX_MODEL 10240 1 10239 99.99%
SYJK_SYSTEM 10240 1 10239 99.99%
USERS 5 1.312 3.688 73.75%
SYJK_UNDO 10240 2.25 10237.75 99.98%
UNDOTBS1 6144 44.437 6099.563 99.28%
SYSTEM 700 692.75 7.25 1.04%
SYSAUX 800 746.125 53.875 6.73%
SYJK_INDEX 10240 7118.062 3121.938 30.49%
SYJK_DATA 20480 8130.062 12349.938 60.3%
释放后表空间的大小
TABLESPACE_NAME TOTAL_SIZE USED_SIZE FREE_SIZE FREE_RATE
SYJK_HISTORY 10240 1 10239 99.99%
SYJK_MODEL 10240 1 10239 99.99%
SYFX_SYSTEM 10240 1 10239 99.99%
SYFX_MODEL 10240 1 10239 99.99%
SYJK_SYSTEM 10240 1 10239 99.99%
USERS 5 1.312 3.688 73.75%
SYJK_UNDO 10240 2.25 10237.75 99.98%
SYJK_DATA 20480 20.875 20459.125 99.9%
UNDOTBS1 6144 44.437 6099.563 99.28%
SYSTEM 700 692.75 7.25 1.04%
SYSAUX 800 746.125 53.875 6.73%
SYJK_INDEX 10240 7118.062 3121.938 30.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