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