轉自 http://www.51testing.com/html/99/478599-842622.html
今天安裝了oracle后,啟動監聽,報錯如下:
啟動tnslsnr: 請稍候...
TNSLSNR for 32-bit
Windows: Version 10.2.0.1.0 - Production
寫入E:\oracle\product\10.2.0\db_2\network\log\listener.log的
日志信息
監聽: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=win2003-64Template)(PORT=1521)))
正在連接到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
LISTENER 的 STATUS
------------------------
別名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
啟動日期 25-3月 -2013 14:30:30
正常運行時間 0 天 0 小時 0 分 1 秒
跟蹤級別 off
安全性 ON: Local OS Authentication
SNMP OFF
監聽程序日志文件 E:\oracle\product\10.2.0\db_2\network\log\listener.log
監聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=win2003-64Template)(PORT=1521)))
監聽程序不支持服務
命令執行成功
服務端報監聽程序不支持服務,那就把焦點放在listener.ora文件上來。listener.ora是oracle服務器端的網絡配置文件,oracle根據它來配監聽服務。它接受遠程對
數據庫的申請,並轉交給oracle的服務進程。出現這個問題的可能原因是文件中沒有增加那個配置。
於是檢查了一下 E:\oracle\product\10.2.0\db_2\network\Admin
文件夾,發現果然是沒有listener.ora文件。難道我迷迷糊糊沒有建立監聽文件,直接去新建了本地net配置?先不管三七二十一,加上listener.ora。添加的內容如下,這個跟通過Net Configuration Assistant新建監聽文件的內容是一樣的:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_2)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = win2003-64Template)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
順便復習一下listener.ora的作用:
在這個文件中一般我們會看到兩個參數
1)參數LISTENER 定義了 監聽“LISTENER” 的 監聽協議地址(listening protocol address)
格式例子:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = CHINA-E24EA7C0A)(PORT = 1521))
)
)
2)參數SID_LIST_LISTENER 用於提供 監聽“LISTENER” 所能夠靜態支持的服務信息。
而且,如果使用EM(Oracle Enterprise Manager)去管理數據庫的話,這個參數是必須的。
格式例子:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = c:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
)
上面看到PLSExtProc,PLSExtProc不是oracle實例,是pl/sql external procdure 的意思,就是在pl/sql中調用外部語句,如c,java寫的過程。這個里面的配置,是讓監聽器產生extproc agent,實際上就是一個extproc進程,用於為external procedure 服務。
添加listener.ora好了,再次啟動。好了,這次啟動成功,出現下面界面:
看到只啟動了PLSExtProc,而我們新建的實例orcl卻沒有起來。這樣其它計算機使用pl/sql連接的話,會出現“
ORA-12514: TNS: 監聽程序當前無法識別連接描述符中請求的服務”。當然原因還是在於listener.ora。一般新建監聽之后,listener.ora中會有相應的配置,但不知道為什么我在上面的操作中也新建了監聽,卻沒有自動生成。那我修改SID_LIST_LISTENER 手動添加以下內容:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_2)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_2)
(GLOBAL_DBNAME= orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = win2003-64Template)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
OK,再試一次。成功。
雖然可能是很簡單的問題,但是還是從中了解了listener.ora的作用,而且,側面反映出我裝oracle的時候心不在焉啦啦!!不過,若非心不在焉,怎么能學會在發現問題的時候怎么排查呢~以后再出現監聽方面的問題,就知道從何下手了。


