客戶回報無法上傳大附件,應用無錯誤訊息,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 表空間。
一般索引遷移語法:
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 卻正常?推測可能涉及:
此點仍待深入鑽研,但實務上「遷移至正確規劃的表空間」已為可靠解法。
-- 產生表遷移語句
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。