在 Red Hat Linux 9 上新安裝 Oracle 10g,因防火牆僅開放特定埠口,需將 Listener 預設埠 1521 修改為 4199。雖已同步更新 listener.ora 與 tnsnames.ora,且 tnsping 測試正常,但使用 sqlplus system/wwm123@wwm 連線卻報錯:
ERROR:
ORA-28547: connection to server failed, probable Oracle Net admin error
將埠口改回 1521 即可正常連線,確認問題在於非預設埠配置。
tnsping 僅驗證網路層面的連通性與名稱解析,不涉及實際的資料庫會話建立。ORA-28547 通常表示用戶端與伺服器端的 Listener 設定不一致,或 Listener 未正確註冊服務。
檢查 listener.ora 發現,SID_LIST_LISTENER 區段僅定義了 PLSExtProc,缺少目標資料庫 WWM 的靜態註冊資訊。當使用非預設埠時,PMON 進程可能無法自動向 Listener 註冊服務(特別是舊版 Oracle 或特定參數設定下),導致 Listener 不知曉該服務的存在,拒絕連線轉發。
在 listener.ora 的 SID_LIST_LISTENER 中新增靜態服務註冊:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /opt/Oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC = # 新增區塊
(GLOBAL_DBNAME = wwm) # 對應 tnsnames.ora 的 SERVICE_NAME
(ORACLE_HOME = /opt/Oracle/product/10.2.0/db_1)
(SID_NAME = wwm) # 實例名
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 4199))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
修改完成後重啟 Listener:
lsnrctl stop
lsnrctl start
再次測試 sqlplus system/wwm123@wwm,連線成功。
LOCAL_LISTENER 參數已正確指向新埠,PMON 會自動動態註冊,無需靜態配置。但為確保相容性與穩定性,建議仍保留靜態註冊。sqlnet.ora 是否設定 NAMES.DIRECTORY_PATH=(TNSNAMES) 以及用戶端 tnsnames.ora 的 PORT 參數是否一致。