首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

解決 ORA-01693:LOB 分段達 MAXEXTENTS 上限與表空間遷移實戰

     編輯:Oracle 資料庫相關知識

客戶回報無法上傳大附件,應用無錯誤訊息,JBoss 日誌亦無異常。Oracle 警示日誌揭露真兇:ORA-01693: MAX # EXTENTS 4096 reached in lobsegment nes.sys_LOB0000024832C00008$$。本文記錄從誤診到根治的完整排查過程,特別釐清 LOB 索引遷移的特殊語法。

錯誤現象與初步嘗試

LOB 分段觸及 MAXEXTENTS 上限。嘗試調整表空間與表層級的 STORAGE (MAXEXTENTS UNLIMITED) 均無效。深入檢視發現:問題表實際存放在 USERS 表空間,而非預期的 TEST 表空間(兩者 MAXEXTENTS 均為無限制)。

關鍵突破:遷移表空間

執行 ALTER TABLE T_ID_CHECK_ACCESSORIES MOVE TABLESPACE TEST; 後,問題即刻解決。進而決定將該使用者下所有表、索引全數遷移至 TEST 表空間。

索引遷移與 LOB 索引陷阱

一般索引遷移語法:

ALTER INDEX idx_name REBUILD TABLESPACE TEST;

但 4 個含 LOB 欄位的表報錯:ORA-02327: cannot create index on expression with datatype LOB。查證後,LOB 索引(實為 LOB 分段)必須透過 ALTER TABLE ... MOVE ... LOB (...) STORE AS ... 語法遷移:

ALTER TABLE table_name MOVE TABLESPACE new_tbsp
  LOB (lob_column) STORE AS lobsegment (TABLESPACE new_tbsp);

執行後須檢查 USER_INDEXES.STATUS = 'UNUSABLE' 的索引並重建。

疑問與反思

同樣設定 MAXEXTENTS UNLIMITED,為何 USERS 表空間會觸發 ORA-01693 而 TEST 卻正常?推測可能涉及:

  • 區域管理方式差異(字典管理 vs. 本地管理)
  • 初始/遞增區塊大小設定不同
  • LOB 分段獨立儲存屬性未正確繼承

此點仍待深入鑽研,但實務上「遷移至正確規劃的表空間」已為可靠解法。

完整遷移腳本範例

-- 產生表遷移語句
SELECT 'ALTER TABLE ' || TABLE_NAME || ' MOVE TABLESPACE TEST;' 
FROM USER_TABLES;

-- 產生一般索引重建語句
SELECT 'ALTER INDEX ' || INDEX_NAME || ' REBUILD TABLESPACE TEST;' 
FROM USER_INDEXES WHERE INDEX_TYPE NOT LIKE '%LOB%';

-- LOB 索引需單獨處理(參考上述語法)

此案例凸顯:LOB 物件遷移有專屬語法,且表空間規劃不當會引發隱性儲存限制,DBA 需建立完整的物件遷移 SOP。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved