[英]How can I reduce oracle database storage?
我有硬盤空間不足的問題。 所以我從oracle數據庫的一個大表中刪除所有記錄。 但是我的硬盤空間沒有改變。 我該如何解決?
試試ALTER TABLE table_name SHRINK SPACE CASCADE;
並重建索引。
從表中刪除所有行不會重置高水位線,也不會釋放任何空間。 這是因為通過DML操作,Oracle假定該空間將在以后重新使用,並且不會費心釋放它。
您可能想改為運行TRUNCATE
語句。 它也比DELETE
快得多,因為它不會生成任何REDO或UNDO。 但是請注意,截斷表是無法回滾的DDL語句。
TRUNCATE
表將空間釋放到表空間,而該空間可用於其他對象。 但是它仍然不會減少所使用的操作系統空間。 減少磁盤空間需要縮小數據文件。
縮小數據文件可能很棘手。 數據文件只能縮小到最后程度。 如果單個數據塊位於文件末尾,則數據文件可能有大量的空白空間,但不可收縮。 在這種情況下,必須對數據文件進行碎片整理。 這可以由Oracle企業管理器完成,您可以找到許多其他腳本來完成。 它們通常涉及移動或重建所有對象。
節省空間的最簡單方法是嘗試縮小每個文件。 這不會釋放所有可用空間,但是實際上,大多數可用空間通常是在最后一個擴展區之后,並且可以回收。
運行以下腳本,它將生成一堆alter語句,以嘗試大量縮小數據文件。 大多數語句將失敗,但是可以。 將數字減半,然后重試。 這是一種“愚蠢”的方法,但是通常可以快速釋放一些空間。
with decrease_size as (select 64 gb from dual)
select 'alter database datafile '''||file_name||''' resize '||to_char(round(bytes/1024/1024/1024)-(select gb from decrease_size))||'g;'
from dba_data_files
where bytes > (select gb from decrease_size) * 1024*1024*1024
order by 1 desc;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.