首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle ORA-01693 實戰:LOB Segment 擴展受限與表/索引表空間遷移完整記錄

     編輯:Oracle 資料庫基礎

故障現象

  • 上傳大附件失敗,前端無錯誤,JBoss 日誌無異常。
  • Alert Log 記錄:ORA-01693: MAX # EXTENTS 4096 reached in lobsegment SYS_LOB0000024832C00008$$

錯誤解讀

ORA-01693: max # extents (string) reached in lob segment string.string
Cause: A LOB segment tried to extend past MAXEXTENTS.
Action: If MAXEXTENTS < system max, raise it. Otherwise, recreate with larger INITIAL/NEXT/PCTINCREASE.

嘗試 1:調整表空間與表級 MAXEXTENTS (無效)

ALTER TABLESPACE USERS DEFAULT STORAGE (MAXEXTENTS UNLIMITED);
ALTER TABLE T_ID_CHECK_ACCESSORIES STORAGE (MAXEXTENTS UNLIMITED);

問題持續,因 LOB Segment 儲存屬性獨立於表級 STORAGE 子句。

根因發現:表建在錯誤表空間

表原建於 USERS 表空間,而非規劃的 TEST 表空間 (IMP 導入時用戶預設表空間為 USERS)。

解決方案:移動表至目標表空間

ALTER TABLE T_ID_CHECK_ACCESSORIES MOVE TABLESPACE TEST;

測試上傳大附件,**即刻恢復正常**。

批量遷移該用戶下所有表與索引

1. 產生表遷移腳本

SELECT 'ALTER TABLE ' || TABLE_NAME || ' MOVE TABLESPACE TEST;'
FROM USER_TABLES;

2. 產生索引遷移腳本

SELECT 'ALTER INDEX ' || INDEX_NAME || ' REBUILD TABLESPACE TEST;'
FROM USER_INDEXES;

特殊情況:LOB 索引遷移報錯 ORA-02327

4 個含 LOB 欄位的表,索引 REBUILD 失敗:ORA-02327: cannot create index on expression with datatype LOB。

原因:LOB 索引 (LOB Segment) 不能用標準 REBUILD,必須在 MOVE TABLE 時同步指定 LOB 儲存子句。

正確語法:MOVE TABLE 並重定向 LOB Segment

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

善後檢查

-- 檢查 UNUSABLE 索引
SELECT INDEX_NAME FROM USER_INDEXES WHERE STATUS = 'UNUSABLE';
-- 重建
ALTER INDEX index_name REBUILD;

核心心得

  1. ORA-01693 在 LOB Segment 上發生時,**表級/表空間級 MAXEXTENTS UNLIMITED 不生效**,需遷移至正確配置的表空間或重建 LOB 儲存屬性。
  2. IMP 導入易導致物件落入預設表空間,**導入前建立目標表空間並修改用戶 DEFAULT TABLESPACE** 可預防。
  3. LOB 物件遷移**必須使用 MOVE TABLE + LOB 子句**,不可單獨 REBUILD LOB 索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved