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

Oracle 常見錯誤代碼深度解析與解決方案:ORA-01650/01652/01578/01628

     編輯:Oracle 資料庫基礎

ORA-01650:回滾段表空間擴展失敗

ORA-01650: unable to extend rollback segment NAME by NUM in tablespace NAME

原因

大量資料操作(批次刪除/更新/匯入)產生大量 Undo,現有回滾段表空間不足,無法分配新區塊。

解決方案

  1. 新增資料檔:
    ALTER TABLESPACE rbs_ts ADD DATAFILE '/path/rbs02.dbf' SIZE 500M;
  2. 檢查可用空間:
    SELECT tablespace_name, SUM(bytes)/1024/1024 MB_FREE
    FROM dba_free_space GROUP BY tablespace_name;
  3. 監控回滾段爭用:
    SELECT class, count FROM v$waitstat 
    WHERE class IN ('system undo header','system undo block','undo header','undo block');
    SELECT SUM(value) FROM v$sysstat WHERE name IN ('db block gets','consistent gets');
    若 waitstat.count / sysstat.sum > 1% 需增加回滾段。
  4. 長期對策:啟用 自動 Undo 管理 (9i+),UNDO_MANAGEMENT=AUTO,UNDO_TABLESPACE=UNDOTBS,Oracle 自動管理擴縮。

ORA-01652:臨時段表空間擴展失敗

ORA-01652: unable to extend temp segment by NUM in tablespace NAME

原因

排序、哈希連接、建立索引、全表掃描等操作需臨時段,臨時表空間不足或碎片化導致無法分配連續空間。

解決方案

  1. 查看臨時表空間碎片:
    SELECT file_id, block_id, blocks, bytes 
    FROM dba_free_space WHERE tablespace_name = 'TEMP';
  2. 檢查預設儲存參數:
    SELECT initial_extent, next_extent, min_extents, pct_increase
    FROM dba_tablespaces WHERE tablespace_name = 'TEMP';
  3. 調大預設儲存值:
    ALTER TABLESPACE TEMP DEFAULT STORAGE (INITIAL 1M NEXT 1M PCTINCREASE 0);
  4. 為用戶指定更大臨時表空間:
    ALTER USER app_user TEMPORARY TABLESPACE LARGE_TEMP;
  5. 新增臨時檔案(即時生效,無需重啟):
    ALTER TABLESPACE TEMP ADD TEMPFILE '/path/temp02.dbf' SIZE 1G;

ORA-01578:資料塊損壞

ORA-01578: ORACLE data block corrupted (file # NUM, block # NUM)

原因分類

  1. 硬體 I/O 錯誤(磁碟壞軌、控制器故障)
  2. 作業系統 I/O 層/快取問題
  3. 記憶體/分頁錯誤
  4. 嘗試讀取未格式化系統塊
  5. 資料檔部分溢出/截斷

診斷與修復流程

  1. 定位損壞物件:
    SELECT owner, segment_name, segment_type
    FROM dba_extents
    WHERE file_id = &F AND &B BETWEEN block_id AND block_id + blocks - 1;
    (&F、&B 為錯誤訊息中的檔號、塊號)
  2. 若為索引:直接重建 ALTER INDEX idx REBUILD;
  3. 若為表:驗證損壞性質
    ANALYZE TABLE table_name VALIDATE STRUCTURE CASCADE;
    • 同樣錯誤參數 → 永久性物理/邏輯壞塊
    • 不同參數 → 可能為記憶體/暫時性錯誤
  4. 有備份:從備份恢復該表/表空間(最佳)
  5. 無備份,需搶救資料:使用 Event 10231 跳過壞塊
    -- 1. 關庫
    -- 2. init.ora 加入:event="10231 trace name context forever, level 10"
    -- 3. STARTUP RESTRICT
    -- 4. CREATE TABLE salvage AS SELECT * FROM corrupted_table;
    -- 5. 移除 event 參數,重啟
    -- 6. RENAME 損壞表,salvage 改回原名
    -- 7. 重建索引、約束、授權
  6. 若為字典/回滾段/系統表空間壞塊:立即聯繫 Oracle Support,勿自行嘗試

ORA-01628:回滾段/表空間達到 MAXEXTENTS 限制

ORA-01628: max # extents NUM reached for rollback segment NUM

原因

區塊數達到 MAXEXTENTS 參數上限(非硬體極限,受 DB_BLOCK_SIZE 影響)。

解決方案

  1. 增加 MAXEXTENTS:
    ALTER TABLESPACE ts_name DEFAULT STORAGE (MAXEXTENTS UNLIMITED);
    或對特定段:
    ALTER ROLLBACK SEGMENT rbs_name STORAGE (MAXEXTENTS UNLIMITED);
  2. 若已達硬體極限 (LARGEST MAXEXTENT):
    • 重建較大 INITIAL/NEXT 的表空間/段
    • EXPORT COMPRESS=Y → 刪除重建 → IMPORT
  3. 定位問題段:
    • 回滾段/索引 → 刪除重建
    • 臨時段 → 調整臨時表空間儲存參數

錯誤代碼快速對照表

錯誤代碼核心原因首要行動長期對策
ORA-01650回滾段表空間滿ADD DATAFILE自動 Undo 管理
ORA-01652臨時表空間滿/碎片ADD TEMPFILE / 調整 STORAGE大臨時表空間 + 監控
ORA-01578資料塊損壞定位物件 / ANALYZE VALIDATE備份驗證 + 硬體巡檢 + Event 10231 搶救
ORA-01628MAXEXTENTS 達上限ALTER STORAGE MAXEXTENTS UNLIMITED大區塊策略 + 遷移至 LMT/ASSM

預防性維護建議

  • 啟用 DB_BLOCK_CHECKING、DB_BLOCK_CHECKSUM 早期發現壞塊
  • 定期 RMAN VALIDATE、ANALYZE VALIDATE STRUCTURE 關鍵表
  • 監控表空間使用率、擴展失敗計數、等待事件
  • 採用 本地管理表空間 (LMT) + 自動段空間管理 (ASSM) 替代字典管理,消除 MAXEXTENTS 煩惱
  • 建立標準化錯誤響應手冊,定期演練

錯誤代碼是資料庫發出的求救信號,理解其背後機制、建立監控預警、準備標準化處置流程,才能從被動救火轉為主動防禦。

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