天天看點

Oracle表空間使用率極低時的解決辦法

表空間竟然達到了20G。

這是怎麼回事,資料庫曾經清庫好幾次,最近剛剛清庫,怎麼會有這麼大的表空間。

我一開始認為是表裡面的垃圾資料太多,清庫不完整,是以導緻表空間這麼大,然後我對資料庫進行清理,

最後導出資料時已經從270M變成10M了,差距相當大。

但是當我再次導入另一個系統時,表空間依然是20G,之後我嘗試導入空表,還是20G,這時候我就想到可能是表本身的空間太大了。

看下圖:

Oracle表空間使用率極低時的解決辦法

這僅僅是一個表,就有這麼大的空間,肯定是由于原來這個表曾經有過幾十萬的資料增長到了700多M,删除資料後,表空間不變,是以就導緻了上面的原因。

當我把上面的表轉存到臨時表的時候,顯示如下:

Oracle表空間使用率極低時的解決辦法

僅僅64KB。之後我就按照下面的操作:

1.将原表全部轉存到臨時表

2.删除原表

3.将臨時表存入原表

4.删除臨時表

我重新整理完之後,我又導出了,這次從10M變成了7M多。

我在另一電腦上再次導入之後,表空間的大小連100M都沒有超過,通過簡單的操作,給電腦節省了20G的空間...

再操作上面4步的時候,可能有人會覺得那麼多表很麻煩,我說一種我常用的方法,大家看下圖:

Oracle表空間使用率極低時的解決辦法

通過excel可以批量寫出樣式一樣的SQL語句....如果誰有更友善的方法,歡迎交流~~~~~~~~~~~~~

注意事項:上面的操作會丢失表的注釋和相應的觸發器等等...

這裡提供一個從網上搜到的查詢表空間的語句

select ff.s tablespace_name,
       ff.b total,
       (ff.b - fr.b) usage,
       fr.b free,
       round((ff.b - fr.b) / ff.b * 100) || '% ' usagep
  from (select tablespace_name s, sum(bytes) / 1024 / 1024 b
          from dba_data_files
         group by tablespace_name) ff,
       (select tablespace_name s, sum(bytes) / 1024 / 1024 b
          from dba_free_space
         group by tablespace_name) fr
 where ff.s = fr.s