ORA-1653: unable to extend table by 1024 in tablespace(oracle表空間滿了的解決方案)

前言

今天某項目的一個Repository的正常CRUD操作,發現報錯信息ORA-1653:unable to extend table by 1024 in tablespace,什麼意思呢,就是表空間已滿,無法擴展.

問題分析

USERS表空間是默認用戶表空間,在創建一個用戶並沒有指定此用戶使用表空間時,該用戶所有信息都會放入到users表空間中,如果有指定則一般是用戶名相關的表空.

--查看錶空間文件
select file_name t from dba_data_files t where t.tablespace_name='xxxx';

--查看錶記錄大小
select t.tablespace_name,t.TABLE_NAME,t.NUM_ROWS from all_tables t where t.tablespace_name='xxxx' order by num_rows desc;

--查看錶空間大小
select t.file_name,t.tablespace_name,t.bytes/1024/1024 "bytes MB",t.maxbytes/1024/1024 "maxbytes MB" from t.dba_data_files where tablespace_name='xxx';

查詢使用xxx表空間的表,按行級降序排序,一般多個表使用相同表空間,存在大量數據導致USER表佔滿,像剛纔查看的這個問題的表,超過一千萬條記錄.

解決方案

  1. 擴展表空間: alter datafile '/oracle/oradata/dba/users01.dbf' resize 30G;
  2. 擴展到最大30G文件無法繼續擴展,可增加數據文件:alter tablespace users add datafile 'users02.dbf' size 1024m autoextend on next 1024m maxsize 30G;
  3. truncate刪除無用表釋放空間,假如未釋放,對TEST表進行收縮shrink,執行下面三個語句:
-- 啓用行遷移:
alter table  TEST enable row movement;
-- shrink表test:
alter TABLE  TEST shrink SPACE;
-- 關閉行遷移:
alter table  TEST DISABLE row movement;

Oracle “高水位”

數據被刪除後(無論是 delete 還是 truncate table),數據文件大小不一定會縮小, 是Oracle"高水位"所致,想要降低數據文件大小需降低高水位的正確做法是先降低HWM,再確定實際佔有大小,再resize數據文件,執行如下4個語句:

  1. 查詢表空間文件編號:select file#, name from v$datafile;
  2. 根據文件 ID 查詢這個數據文件最大數據塊(data block)的編號:select max(block_id) from dba_extents where file_id=4;
  3. 計算該表空間實際佔用的空間,先查詢數據塊大小,默認是8192: select value from v$parameter where name='db_block_size'
  4. 計算實際佔用磁盤大小: select 65673*8/1024 from dual;
  5. 把數據文件大小resize到比實際佔用磁盤大小大一些就行了,這樣數據文件大小就變小了,節約空間 :alter database datafile '/oracle/oradata/dba/users01.dbf' resize 600m;
  6. 需要使用的表,修改表空間alter table xxx move tablespace new_tablespace,建表時需養成習慣,指定好表空間.

更多詳情可以參考 <<Oracle官方Changing Datafile Size>>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章