同一台主機運行兩個實例(o8161, o8151),啟動第二個 Listener 報錯:
TNS-01106: Listener using listener name LISTENER has already been started
兩個 listener.ora 中 IPC 協議的 KEY 相同(預設 EXTPROC0)。OS 層面 IPC Key 必須全局唯一,導致第二個進程綁定失敗。
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))
)
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
EXTPROC_${ORACLE_SID} 或 IPC_${HOSTNAME}_${SID}.env 腳本,啟動/停止/狀態檢查全自動化SID_LIST 註冊多個 SID,簡化運維但耦合風險較高單機多實例部署的核心衝突點在於 IPC Key 唯一性 與 TCP Port 唯一性。遵循「一實例一 Listener 一 Key 一 Port」原則,配合環境變數隔離腳本,可實現多版本、多實例穩定共存。