Oracle 刪除資料後釋放資料檔案所佔磁碟空間

2021-10-03 06:10:44 字數 2022 閱讀 3109

oracle 刪除資料後釋放資料檔案所佔磁碟空間

測試的時候向資料庫中插入了大量的資料,測試完成後刪除了測試使用者以及其全部資料,但是資料檔案卻沒有縮小。經查閱資料之後發現這是 oracle 「高水位」所致,那麼怎麼把這些資料檔案的大小降下來呢?解決辦法如下:

概念:表空間的相關知識請見這裡,詳細的介紹了 oracle 資料庫的儲存結構。

高水位:high water mark (hwm),是段(segment)的乙個指標,界定了段(segment)曾經配置過的 block 水位。

據說,隨著資料的 insert,所使用段(segment)的資料塊(data block)也不斷增加,這時候高水位(hwm)也隨著上公升。當資料被刪除後(無論是 delete 還是 truncate table)雖然被占用的資料塊(data block)已經相應減少,但是高水位(hwm)並不會隨之下降。當高水位(hwm)下存在大量的空白資料塊(data block)時,如果發生全表掃瞄(full table scan, fts)就會造成很多額外的 io。因為全表掃瞄(fts)的時候讀取段(segment)中的資料塊(data block)會一直讀取到高水位(hwm)才結束。高水位(hwm)就是段(segment)中資料塊(data block)有沒有使用的分界線,所以全表掃瞄(fts)所花費的時間不但不會因為資料的刪除而減少,反而會增加。(關於此段查詢效率的內容有待驗證,筆者未親自驗證。不過可以確定的是高水位確實不會隨著資料的刪除而下降。)

降低高水位的正確做法是先降低hwm,再確定實際占有大小,再resize資料檔案。

資料檔案比較多,我們用其中乙個較大的檔案做為 demo,其它資料檔案如法炮製即可。我選擇的檔案是:d:\oracle\product\10.2.0\oradata\orcl\users01.dbf 1.4gb 左右。

1.登入 sqlplus:

語法:sqlplus username/password@hostname:port/sid

例:sqlplus system/orcl@localhost:1521/orcl

2.查詢這個資料檔案的編號:

sql> select file#, name from v$datafile;

1 d:\oracle\product\10.2.0\oradata\orcl\system01.dbf

2 d:\oracle\product\10.2.0\oradata\orcl\undotbs01.dbf

3 d:\oracle\product\10.2.0\oradata\orcl\sysaux01.dbf

4 d:\oracle\product\10.2.0\oradata\orcl\users01.dbf

可以看到,我們要操作的資料檔案的編號是4。

2.根據檔案 id 查詢這個資料檔案最大資料塊(data block)的編號:(似乎這個最大編號可以代表該資料檔案中資料塊的數量,這一點有待考證。)

sql> select max(block_id) from dba_extents where file_id=4;

3.計算該錶空間實際占用的空間:

–查詢資料塊的大小,單位是 byte

sql> select value from v$parameter where name=『db_block_size』

name type value

db_block_size integer 8192

–8192 byte = 8 kb

–接下來計算該錶空間占用的物理空間

sql> select 65673 * 8 / 1024 from dual;

513.070313

–實際占用的物理空間是 513mb 多點

4.最後一步,把我們的資料檔案尺寸修改得比這個表空間實際占用的物理空間大點就行了:

sql> alter database datafile 『d:\oracle\product\10.2.0\oradata\orcl\users01.dbf』 resize 600m;

資料庫已更改。

ok,資料檔案從修改前的 1.4gb 變成了 600mb。對於其它的資料檔案,大家也知道如何收縮了吧?

oracle刪除資料釋放表空間流程

生產環境 資料庫裡空間不足,niptest 表空間251g,只使用了17g 再alter database datafile niptest1 resize 10g 的時候說超出了範圍要求 由於表變動比較頻繁,高水位值比較大 高水位 hwm high water mark oracle中block有...

oracle刪除資料後的恢復

要達到刪除資料,有以下幾種方式都可以 1 delete 2 drop乙個表 3 truncate乙個表 重要的不是怎麼刪除乙個表,而是誤刪除資料後怎麼立即恢復 不考慮全庫備份和利用歸檔 日誌 對於delete方法,可以利用oracle提供的閃回方法 如果在刪除資料後還沒做大量的操作 只要保證被刪除資...

oracle刪除資料後的恢復

要達到刪除資料,有以下幾種方式都可以 a 確定刪除資料的時間 在刪除資料之前的時間就行,不過最好是刪除資料的時間點 b 用以下語句找出刪除的資料 select from 表名 as of timestamp to timestamp 刪除時間點 yyyy mm dd hh24 mi ss c 把刪除...