如何在 listener.ora 中配置沒有 SID_LIST_LISTENER 的 Oracle Listener?
我可以使用以下 listener.ora 訪問 ORACLE 11g 伺服器
# listener.ora Network Configuration File: D:\app\Administrator\product\11.1.0\db_1\NETWORK\ADMIN\listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.111)(PORT = 1521)) ) )
它為該伺服器上的所有實例提供服務,我可以通過以下方式驗證
lsnrctl status
我的問題是,當我在虛擬機中全新安裝 Oracle 11g 時,我必須使用 listener.ora 之類的
# listener.ora Network Configuration File: C:\app\oracle\product\11.2.0\dbhome_1\network\admin\listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle\product\11.2.0\dbhome_1\bin\oraclr11.dll") ) (SID_DESC = (GLOBAL_DBNAME = ORCL) (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1) (SID_NAME = orcl) ) (SID_DESC = (GLOBAL_DBNAME = BMBK) (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1) (SID_NAME = BMBK) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 169.254.200.102)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) ) ADR_BASE_LISTENER = C:\app\oracle
沒有 SID_LIST_LISTENER 實體,即使用來自我得到的其他伺服器的 listener.ora
C:\Windows\system32>lsnrctl status LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 27-NOV-2011 10:14 :24 Copyright (c) 1991, 2010, Oracle. All rights reserved. Anmeldung bei (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) STATUS des LISTENER ------------------------ Alias LISTENER Version TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Produ ction Startdatum 27-NOV-2011 10:14:08 Uptime 0 Tage 0 Std. 0 Min. 18 Sek. Trace-Ebene off Sicherheit ON: Local OS Authentication SNMP OFF Parameterdatei des Listener C:\app\oracle\product\11.2.0\dbhome_1\network\admin\ listener.ora Log-Datei des Listener c:\app\oracle\diag\tnslsnr\WSV-BK-W7en64-S\listener\al ert\log.xml Zusammenfassung Listening-Endpunkte... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=169.254.200.102)(PORT=1521))) Der Listener unterst³tzt keine Services Der Befehl wurde erfolgreich ausgef³hrt.
最後一條消息轉換為
偵聽器不支持任何服務。
我不知道為什麼這兩個伺服器的行為不同。我在配置文件和系統資料庫項中都沒有發現任何提示。
編輯:
我想答案隱藏在Burleson Consulting 的這篇文章中,但我沒有找到實際配置的位置。
在這個派對上有點晚了……
數據庫應該自動向偵聽器註冊,使
SID_LIST
條目變得多餘,這似乎發生在您的192.168.111.111
環境中。如果偵聽器在數據庫之後啟動,它可能需要一段時間才能註冊,並且可能存在根本不這樣做的情況。您可以嘗試使用命令使其註冊
alter system register
。數據庫使用該LOCAL_LISTENER
參數來標識它應該註冊的偵聽器。預設情況下為 null,根據文件,它相當於hostname:1521
.如果
alter system register
沒有使服務出現在lsnrctl status
輸出中,那麼我懷疑它無法辨識主機名或解析它,或者它解析到與偵聽器所在的地址不同的地址,或者LOCAL_LISTENER
設置為無效的虛擬盒子。您可以將 設置為直接LOCAL_LISTENER
匹配listener.ora
,例如:alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope=both; alter system register;
或者,您可以使用包含這些詳細資訊的別名
tnsnames.ora
。例如,如果您添加tnsnames.ora
如下條目:MY_LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) )
然後你可以:
alter system set local_listener='MY_LISTENER' scope=both; alter system register;
tnsnames.ora
除了簡潔之外,我可以看到使用該版本的唯一真正優勢是您可以在 SQL*Net 文件中而不是在數據庫中更改配置;甚至只有在您在機器之間複製數據庫,或者讓您的偵聽器和數據庫在不同帳戶下執行(例如,使用grid
RAC/HA 使用者)時,這似乎才真正有用。
LOCAL_LISTENER
這裡還有更多內容。**編輯:**這似乎很全面。
我有一個類似的問題,發現只是關閉並重新啟動實例會導致它正確註冊。
這可以通過使用 sqlplus 命令行來完成。您需要以具有 SYSDBA 權限(例如係統)語法的使用者身份登錄:
sqlplus name/pass as SYSDBA
然後執行“關機”並等待它完成。然後執行“啟動”並等待它完成。
手指交叉,您現在應該有一個向偵聽器註冊的實例。
要檢查是否是這種情況,您可以啟動 lsnrctl 並執行命令“status”。如果它不起作用,您仍然會看到消息“偵聽器不支持任何服務”,否則您會看到類似
Service "horse" has 1 instance(s). Instance "horse", status READY, has 1 handler(s) for this service...