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

Oracle 常見異常代碼速查表與處理策略 (ORA-00001/01400/01555/01652/03113/04031/07445/12514/12541/28001)

     編輯:Oracle 教學

Oracle 常見異常代碼速查表與處理策略

整理 DBA 開發運維中最高頻的 10 大 ORA 錯誤,含原因、影響、即時處理、根治方案。

錯誤代碼名稱典型原因即時處理根治/預防
ORA-00001Unique Constraint Violated主鍵/唯一鍵重複值檢查業務邏輯,捕獲例外處理使用 Sequence/Identity Column;應用層冪等性設計
ORA-01400Cannot Insert NULLNOT NULL 欄位未賦值補齊預設值或業務必填檢核DDL 加 DEFAULT;API 參數校驗
ORA-01555Snapshot Too OldUndo 保留不足/長查詢與高 DML 衝突增加 UNDO_TABLESPACE/UNDO_RETENTION;避免長查詢並發大批次 DML啟用 UNDO 保留保證 (RETENTION GUARANTEE);調優長跑 SQL
ORA-01652Unable to Extend Temp Segment臨時表空間不足 (大排序/Hash Join/Index Build)ADD TEMPFILE;殺掉佔用大量 Temp 的 Session啟用 AUTOEXTEND;監控 V$TEMPSEG_USAGE;調優排序 SQL (PGA/Index)
ORA-03113End-of-File on Communication ChannelServer Process 異常終止 (OOM/Bug/OS Kill)檢查 Alert Log / Trace 定位根因;重新連線修復觸發 Bug 的補丁;OS 記憶體/磁碟監控;避免 OOM Killer
ORA-04031Unable to Allocate Shared MemoryShared Pool/Large Pool 碎片/不足FLUSH SHARED_POOL (慎用);重啟實例啟用 ASMM/AMM;使用 Bind Variable;設定 _KGHDSIDX_COUNT;大物件用 DBMS_SHARED_POOL.KEEP
ORA-07445Core Dump (Internal Error)Code Bug / Memory Corruption / Hardware收集 Incident Package (ADRCI) 開 SR套用最新 PSU/RU;檢查硬體 ECC 錯誤;避免已知 Bug 操作
ORA-12514Listener Does Not Know ServiceService Name 未註冊到 Listener檢查 SERVICE_NAME 拼寫;重啟 Listener/DB 觸發自動註冊靜態註冊 (SID_LIST) 關鍵服務;監控 Listener Log
ORA-12541No ListenerListener 未啟動/Port 阻擋/Host 錯誤啟動 Listener;防火牆開放 1521;tnsnames.ora Host/IP 正確Listener 自啟動腳本;網路連通性監控
ORA-28001Password Has Expired密碼過期 (Profile PASSWORD_LIFE_TIME)ALTER USER ... IDENTIFIED BY new_pwd; 或修改 Profile服務帳號設為 DEFAULT Profile (無限期);定期輪換腳本

通用排查三步曲

  1. 看 Alert Log:`$ADR_BASE/diag/rdbms///trace/alert_.log` - 總是第一現場。
  2. 找 Trace/Incident:`ORA-07445/00600/04031` 必有 Trace 檔,用 `ADRCI` 打包上傳 MOS。
  3. 查 MOS:錯誤代碼 + 關鍵字 (如 `ORA-04031 shared pool`) 搜尋 Note/Bug/Patch。

開發端異常處理模板 (PL/SQL)

BEGIN
  -- 業務邏輯
  INSERT INTO orders ...;
EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
    -- ORA-00001
    log_error('Duplicate Order', SQLCODE, SQLERRM);
    RAISE_APPLICATION_ERROR(-20001, '訂單號已存在');
  WHEN OTHERS THEN
    -- 記錄完整堆疊
    log_error('Order Insert Failed', SQLCODE, SQLERRM, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
    RAISE;  -- 向上拋出或轉為自訂錯誤
END;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved