oracle truncateb表後 表空間釋放問題的解決辦法
阿新 • • 發佈:2019-02-14
檢查資料庫表空間時,發現有的表空間使用率很大,但是庫裡又沒資料。搜尋整理下,如何釋放表空間 已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