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

Oracle ORA-07445 & ORA-00108 錯誤案例分析:克隆虛擬機修改 IP 後啟動失敗

     編輯:Oracle 教學

Oracle ORA-07445 & ORA-00108 錯誤案例分析

在將 Oracle 資料庫虛擬機克隆並修改 IP/主機名後啟動實例,遭遇 ORA-07445 [kslgetl()+120] 核心傾印與 ORA-00108: failed to set up dispatcher 錯誤。本文記錄完整排查過程、根因定位與修復步驟,供同類環境遷移參考。

環境資訊

Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
Linux 2.6.32-200.13.1.el5uek (Oracle Unbreakable Enterprise Kernel)
Instance Name: epps

告警日誌關鍵錯誤

Errors in file /u01/app/oracle/admin/epps/bdump/epps_ora_5109.trc:
ORA-07445: exception encountered: core dump [kslgetl()+120] [SIGSEGV] [Address not mapped to object] [0x000000208]
ORA-00108: failed to set up dispatcher to accept connection asynchronously

dispatcher 'D000' encountered error getting listening address
NS Primary Error: TNS-12533: TNS:illegal ADDRESS parameters
NS Secondary Error: TNS-12560: TNS:protocol adapter error
NT Generic Error: TNS-00503: Illegal ADDRESS parameters

Trace 檔關鍵片段

Warning: keltnfy call to ldmInit failed with error 46
network error encountered getting listening address:
 NS Primary Error: TNS-12533: TNS:illegal ADDRESS parameters
 NS Secondary Error: TNS-12560: TNS:protocol adapter error
 NT Generic Error: TNS-00503: Illegal ADDRESS parameters
OPIRIP: Uncaught error 108. Error stack:
ORA-00108: failed to set up dispatcher to accept connection asynchronously
Exception signal: 11 (SIGSEGV), code: 1 (Address not mapped to object), addr: 0x208, PC: [0x75f178, kslgetl()+120]

排查邏輯與關鍵發現

  1. 現象:Dispatcher (D000) 反覆啟動失敗,伴隨 kslgetl() 記憶體存取違規 (SIGSEGV)。
  2. 錯誤碼指向:TNS-12533 / TNS-00503: Illegal ADDRESS parameters 表明監聽地址解析異常。
  3. 假設:克隆後修改 IP/主機名,導致網路配置檔 (listener.ora, tnsnames.ora, /etc/hosts) 與實際主機名不一致,Dispatcher 解析本地監聽地址失敗,進而觸發內部 Latch (kslgetl) 競爭異常。
  4. 驗證:
    [oracle@getlnx01uat ~]$ hostname
    getlnx01uat.esquel.com
    [oracle@getlnx01uat ~]$ ping getlnx01uat.esquel.com
    # 此時可通,但檢查 /etc/hosts 發現條目錯誤
    [oracle@getlnx01uat ~]$ cat /etc/hosts
    127.0.0.1 localhost.localdomain localhost
    xxxx getlnx01uat.com getlnx01uat   # 缺少 .esquel.com 完整 FQDN
  5. 根因確認:/etc/hosts 中主機名條目不完整 (getlnx01uat.com vs 實際 getlnx01uat.esquel.com),導致 Dispatcher 解析本地端點時參數非法,觸發底層 Latch 錯誤進而 Core Dump。

修復步驟

  1. 修正 /etc/hosts,確保主機名解析正確:
    # 正確格式
    127.0.0.1   localhost.localdomain localhost
    192.168.x.x  getlnx01uat.esquel.com getlnx01uat
  2. 同步檢查 listener.ora 與 tnsnames.ora 中的 HOST 參數是否為正確 IP 或可解析主機名。
  3. 重啟資料庫實例:
    SQL> SHUTDOWN IMMEDIATE;
    SQL> STARTUP;
  4. 驗證 Dispatcher 正常啟動:
    LSNRCTL> services
    # 應看到 D000 狀態 READY

知識延伸:Dispatcher 與 Shared Server 架構

  • Dispatcher (Dnnn):共享伺服器架構的前端進程,負責接收客戶端請求並放入共享請求佇列。
  • Shared Server (Snnn):從佇列取出請求處理,處理完將結果放回回應佇列。
  • 啟用條件:DISPATCHERS 參數設定 (如 (PROTOCOL=TCP)(DISPATCHERS=3))。
  • Dispatcher 啟動時需綁定監聽端點,依賴作業系統網路堆疊正確解析本地地址。

遷移/克隆檢查清單 (防患未然)

  1. /etc/hosts:新 IP 對應完整 FQDN 與短主機名。
  2. /etc/sysconfig/network (或 /etc/hostname):永久主機名設定。
  3. listener.ora:HOST = 新IP或主機名。
  4. tnsnames.ora:服務條目指向新 IP/主機名。
  5. sqlnet.ora:NAMES.DIRECTORY_PATH=(TNSNAMES, HOSTNAME)。
  6. 資料庫參數 LOCAL_LISTENER、REMOTE_LISTENER 指向正確端點。
  7. 若使用 Grid Infrastructure/ASM,同步更新 OCR 中的網路資源。
  8. 重啟網路服務或重開機驗證 hostname -f 回傳完整 FQDN。

參考資源

  • Oracle Support Doc ID 1342753.1 - ORA-07445 [kslgetl()] / ORA-00108 After Cloning/Changing Hostname
  • Metalink Note 372959.1 - Troubleshooting Dispatcher Startup Failures

總結

克隆虛擬機修改網路身份後,/etc/hosts 主機名解析不一致 是導致 Dispatcher 啟動失敗、進而觸發 ORA-07445/ORA-00108 的常見根因。建立標準化遷移檢查清單,確保作業系統層面的網路身份 (hostname, /etc/hosts, DNS) 與 Oracle 網路配置 (listener.ora, tnsnames.ora, LOCAL_LISTENER) 完全一致,可避免此類難以診斷的核心錯誤。

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