使用者所關聯的表都刪除了,但是表空間不能自己釋放。找到了下面一條sql語句,它的作用是查詢(拼接)出縮小表空間檔案(datafile)的語句,預設是計算所有的表空間檔案,給出可以釋放的大小。根據它給出的結果,執行類似「 alter database datafile 'e:\oracle\nnc_data03.dbf' resize 1208m;」的語句,就可以立竿見影的看到壓縮表空間的效果了。
select
a .file#,
a . name,
a .bytes / 1024 / 1024 currentmb,
ceil (hwm * a .block_size) / 1024 / 1024 resizeto,
(a .bytes - hwm * a .block_size) / 1024 / 1024 releasemb,
'alter database datafile ''' || a . name || ''' resize ' || ceil (hwm * a .block_size / 1024 / 1024) || 'm;' resizecmd
from
v$datafile a,
( select
file_id,
max (block_id + blocks - 1) hwm
from
dba_extents
group by
file_id
) bwhere
a .file# = b.file_id (+)
and (a .bytes - hwm * block_size) > 0
order by
5
在oracle中,經常有這樣的情況,由於誤操作,使某個表空間過大。delete 方法不會清除高水位線,用了truncate之後,雖然高水位線已經清除,但是擴充的表空間並沒有縮小,所以應該用下面的方法進行縮小:
1.查詢表空間對應的資料檔案id,以users表空間為例:
select file_id from dba_data_files where tablespace_name ='users'
2.允許表空間進行收縮(對錶空間進行融合):
alter tablespace users coalesce;
3.查詢表空間中表對應的大小,好確定對哪張表進行操作:
select * from dba_segments where tablespace_name='users' and segment_type='table'
4.允許表進行行移動(某些表不能進行truncate,只能delete)
alter table test row movement;
5.對錶進行高水位線**:
alter table test shrink space;
6.最後,對第一步查出的資料檔案id進行壓縮(resize),大小一定要大於已用大小:
alter database datafile 4 resize 2000m;
經過上述操作,擴大的表空間就可以收縮回正常尺寸了,親測可用!
mysql收縮空間 Oracle表空間收縮方案
對於表空間收縮,oracle只提供擴大的功能,而不提供收縮。所以,要實現這樣的要求,就只能先建立乙個中間表空間,然後將待收縮表 應用背景 某些情況下,由於前期設計上沒有考慮全面,導致表空間預建太大,遠遠超出實際使用大小。於是,就出現了收縮表空間這樣的需求,即將這個表空間的占用空間進行收縮。處理方案 ...
收縮臨時表空間
當排序操作 重建索引等大型操作無法在記憶體中完成時,臨時表空間將為排序提供便利。一般情況下臨時表空間為多個使用者,多個會話所共 享。不能為會話分批空間配額。臨時表空間耗用過度且在不能自動擴充套件的情形下將收到 ora 1652 unable to extend temp segment 錯誤.下面 ...
Oracle 表空間收縮
業務表頻繁寫入,刪除,清空後,表占用的空間不能夠及時釋放,需要通過如下方式手工釋放空間。更新業務表統計資訊 call dbms stats.gather table stats user name table name 收縮業務表空間占用 alter table enable row movemen...