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

單機雙實例配置雙 Listener 實戰:IPC KEY 衝突解決與獨立啟動

     編輯:Oracle 資料庫基礎

問題現象

同一台主機運行兩個實例(o8161, o8151),啟動第二個 Listener 報錯:

TNS-01106: Listener using listener name LISTENER has already been started

根因分析

兩個 listener.ora 中 IPC 協議的 KEY 相同(預設 EXTPROC0)。OS 層面 IPC Key 必須全局唯一,導致第二個進程綁定失敗。

解決方案:修改 KEY 值區分實例

實例 1 (o8161) - 保持預設

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)))
      (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = loopback)(PORT = 1521)))
    )
    (DESCRIPTION = (PROTOCOL_STACK = (PRESENTATION = GIOP)(SESSION = RAW))
      (ADDRESS = (PROTOCOL = TCP)(HOST = loopback)(PORT = 2481))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC = (SID_NAME = PLSExtProc)(ORACLE_HOME = /Oracle)(PROGRAM = extproc))
    (SID_DESC = (SID_NAME = o8161)(ORACLE_HOME = /Oracle))
  )

實例 2 (o8151) - 修改 KEY 與 PORT

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = TESTo815)))  -- ★ 唯一 KEY
      (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = loopback)(PORT = 1526)))  -- ★ 獨立 PORT
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC = (SID_NAME = ora8151)(ORACLE_HOME = /ora815)(PROGRAM = extproc))
  )

驗證啟動

# 實例 1 環境
export ORACLE_HOME=/Oracle; export ORACLE_SID=o8161
lsnrctl start

# 實例 2 環境
export ORACLE_HOME=/ora815; export ORACLE_SID=o8151
lsnrctl start

# 確認兩進程共存
ps -ef | grep tnslsnr

最佳實踐清單

  1. IPC KEY 命名規範:EXTPROC_${ORACLE_SID} 或 IPC_${HOSTNAME}_${SID}
  2. TCP PORT 規劃:1521 為主實例,1526/1527... 為備用實例,避開防火牆預設規則
  3. 環境變數隔離:每實例專屬 .env 腳本,啟動/停止/狀態檢查全自動化
  4. 單一 Listener 多實例註冊(替代方案):一個 Listener 監聽 1521,SID_LIST 註冊多個 SID,簡化運維但耦合風險較高

結語

單機多實例部署的核心衝突點在於 IPC Key 唯一性 與 TCP Port 唯一性。遵循「一實例一 Listener 一 Key 一 Port」原則,配合環境變數隔離腳本,可實現多版本、多實例穩定共存。

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