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

检查数据库表空间时,发现有的表空间使用率很大,但是库里又没数据。搜索整理下,如何释放表空间 已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  


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值