首頁
編程語言
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

成因

大事務導致現有回滾段耗盡,表空間無可用擴展空間。

解決

  1. 擴容表空間:ALTER TABLESPACE ts_name ADD DATAFILE 'path' SIZE 1G;
  2. 檢查裸設備剩餘空間,謹慎擴容;
  3. 查詢剩餘空間:SELECT * FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME='TS_NAME';
  4. 監控回滾段爭用:
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');

若 COUNT/SUM(VALUE) > 1%,需增加回滾段。

錯誤二:ORA-01652 — 臨時段表空間不足

現象

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

成因

排序、雜湊、建索引等操作需要臨時段,表空間缺乏連續可用空間。

解決

  1. 查詢最大可用連續塊:SELECT FILE_ID, BLOCK_ID, BLOCKS, BYTES FROM SYS.DBA_FREE_SPACE WHERE TABLESPACE_NAME='TEMP_TS';
  2. 檢查預設儲存參數:SELECT INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS, PCT_INCREASE FROM SYS.DBA_TABLESPACES WHERE TABLESPACE_NAME='TEMP_TS';
  3. 調大預設儲存值:ALTER TABLESPACE TEMP_TS DEFAULT STORAGE (INITIAL 10M NEXT 10M);
  4. 或修改用戶臨時表空間:ALTER USER username TEMPORARY TABLESPACE NEW_TEMP_TS;

注意:添加數據文件即時生效,無需離線;但添加後不可單獨刪除文件,僅能刪除整個表空間。

錯誤三:ORA-01578 — 數據塊損壞

現象

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

成因

  1. 硬體 I/O 錯誤;
  2. 作業系統 I/O/緩存問題;
  3. 記憶體/分頁錯誤;
  4. 訪問未格式化系統塊;
  5. 數據文件部分溢出。

診斷定位

SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE 
FROM DBA_EXTENTS 
WHERE FILE_ID = &file_id 
  AND &block_id BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1;

處理策略

  • 索引壞塊:直接重建索引;
  • 表壞塊:
    1. ANALYZE TABLE tbl VALIDATE STRUCTURE CASCADE; 多次執行鑑別永久性 vs 隨機性;
    2. 有備份:恢復表;
    3. 無備份:啟用 Event 10231 跳過壞塊導出數據:
      -- 1. SHUTDOWN IMMEDIATE
      -- 2. init.ora 添加: EVENT="10231 TRACE NAME CONTEXT FOREVER, LEVEL 10"
      -- 3. STARTUP RESTRICT
      -- 4. CREATE TABLE temp_table AS SELECT * FROM bad_table;
      -- 5. 移除 EVENT,重啟
      -- 6. RENAME bad_table TO bad_table_old; RENAME temp_table TO bad_table;
      -- 7. 重建索引、約束、授權
  • 數據字典/回滾段壞塊:立即聯繫 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 STORAGE (MAXEXTENTS 9999);(不超過 LARGEST_MAXEXTENTS);
  2. 若已達硬上限:重建大區段表空間 → EXPORT COMPRESS=Y 導出 → 重建表 → 導入;
  3. 若發生在回滾段/索引:DROP 重建;臨時表空間:修改儲存參數。

通用預防體系

  • 表空間使用率告警(閾值 80%);
  • 定期 ANALYZE ... VALIDATE STRUCTURE 掃描壞塊;
  • 備份恢復演練常態化;
  • 監控 V$WAITSTAT、V$SYSSTAT 回滾段爭用指標。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved