記錄下剛剛做的一個為一個資料庫(t02)配置多個監聽(listener)的實驗,過程有點小曲折。
(1)新增兩個測試的監聽,listener.ora的配置內容(可純手動編輯該檔案或使用netca)如下:
(LISTENER為系統原有;L1、L2為測試用新增的監聽)
# listener.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br /># Generated by Oracle configuration tools.</p><p>L2 =<br /> (DESCRIPTION_LIST =<br /> (DESCRIPTION =<br /> (ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1523))<br /> )<br /> )</p><p>L1 =<br /> (DESCRIPTION_LIST =<br /> (DESCRIPTION =<br /> (ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1522))<br /> )<br /> )</p><p>SID_LIST_LISTENER =<br /> (SID_LIST =<br /> (SID_DESC =<br /> (SID_NAME = PLSExtProc)<br /> (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)<br /> (PROGRAM = extproc)<br /> )<br /> )</p><p>LISTENER =<br /> (DESCRIPTION_LIST =<br /> (DESCRIPTION =<br /> (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))<br /> (ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1521))<br /> )<br /> )<br />
(2)配置tnsnames.ora,使資料庫(t02)可同時使用以上3個監聽:
# tnsnames.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora<br /># Generated by Oracle configuration tools.</p><p>T01 =<br /> (DESCRIPTION =<br /> (ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1521))<br /> (CONNECT_DATA =<br /> (SERVER = DEDICATED)<br /> (SERVICE_NAME = t01)<br /> )<br /> )</p><p>T02 =<br /> (DESCRIPTION =<br /> (ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1521))<br /> (ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1522))<br /> (ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1523))<br /> (CONNECT_DATA =<br /> (SERVER = DEDICATED)<br /> (SERVICE_NAME = t02)<br /> )<br /> )</p><p>EXTPROC_CONNECTION_DATA =<br /> (DESCRIPTION =<br /> (ADDRESS_LIST =<br /> (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))<br /> )<br /> (CONNECT_DATA =<br /> (SID = PLSExtProc)<br /> (PRESENTATION = RO)<br /> )<br /> )<br />
(3)檢查及測試,發現問題:
檢查的時候發現除了預設的LISTENER監聽外,L1和L2始終不能註冊服務:
C:\>lsnrctl</p><p>LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 24-7月 -2011 22:19:24</p><p>Copyright (c) 1991, 2005, Oracle. All rights reserved.</p><p>歡迎來到LSNRCTL, 請鍵入"help"以獲得資訊。</p><p>LSNRCTL> status<br />正在串連到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))<br />LISTENER 的 STATUS<br />------------------------<br />別名 LISTENER<br />版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production<br />啟動日期 24-7月 -2011 22:14:18<br />正常已耗用時間 0 天 0 小時 5 分 13 秒<br />追蹤層級 off<br />安全性 ON: Local OS Authentication<br />SNMP OFF<br />監聽程式參數檔案 D:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br />監聽程式記錄檔 D:\oracle\product\10.2.0\db_1\network\log\listener.log<br />監聽端點概要...<br /> (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))<br /> (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PC1255-20110528)(PORT=1521)))<br />服務摘要..<br />服務 "+ASM_XPT" 包含 1 個常式。<br /> 常式 "+asm", 狀態 BLOCKED, 包含此服務的 1 個處理常式...<br />服務 "+asm" 包含 1 個常式。<br /> 常式 "+asm", 狀態 BLOCKED, 包含此服務的 1 個處理常式...<br />服務 "PLSExtProc" 包含 1 個常式。<br /> 常式 "PLSExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理常式...<br />服務 "t01" 包含 1 個常式。<br /> 常式 "t01", 狀態 READY, 包含此服務的 1 個處理常式...<br />服務 "t01XDB" 包含 1 個常式。<br /> 常式 "t01", 狀態 READY, 包含此服務的 1 個處理常式...<br />服務 "t01_XPT" 包含 1 個常式。<br /> 常式 "t01", 狀態 READY, 包含此服務的 1 個處理常式...<br />命令執行成功<br />LSNRCTL> stop<br />正在串連到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))<br />命令執行成功<br />LSNRCTL> set curr L1<br />目前的監聽程式為 L1<br />LSNRCTL> status<br />正在串連到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=PC1255-20110528)(PORT=1522)))<br />LISTENER 的 STATUS<br />------------------------<br />別名 L1<br />版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production<br />啟動日期 24-7月 -2011 22:14:19<br />正常已耗用時間 0 天 0 小時 5 分 26 秒<br />追蹤層級 off<br />安全性 ON: Local OS Authentication<br />SNMP OFF<br />監聽程式參數檔案 D:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br />監聽程式記錄檔 D:\oracle\product\10.2.0\db_1\network\log\l1.log<br />監聽端點概要...<br /> (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PC1255-20110528)(PORT=1522)))<br />監聽程式不支援服務<br />命令執行成功<br />LSNRCTL> set curr L2<br />目前的監聽程式為 L2<br />LSNRCTL> status<br />正在串連到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=PC1255-20110528)(PORT=1523)))<br />LISTENER 的 STATUS<br />------------------------<br />別名 L2<br />版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production<br />啟動日期 24-7月 -2011 22:14:19<br />正常已耗用時間 0 天 0 小時 5 分 38 秒<br />追蹤層級 off<br />安全性 ON: Local OS Authentication<br />SNMP OFF<br />監聽程式參數檔案 D:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br />監聽程式記錄檔 D:\oracle\product\10.2.0\db_1\network\log\l2.log<br />監聽端點概要...<br /> (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PC1255-20110528)(PORT=1523)))<br />監聽程式不支援服務<br />命令執行成功
停止了預設的LISTENER監聽後,使用tns進行串連測試的時候報錯(ORA-12514):
C:\Documents and Settings\Administrator>sqlplus scott/tiger@t02</p><p>SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 7月 24 22:20:06 2011</p><p>Copyright (c) 1982, 2005, Oracle. All rights reserved.</p><p>ERROR:<br />ORA-12514: TNS: 監聽程式當前無法識別串連描述符中請求的服務<br />
(4)分析問題:
一陣google之後發現,如果預設連接埠不是1521,則需要設定LOCAL_LISTENER來手動指定監聽別名:
When configuring the listener to listen on TCP/IP, you should enter the default port of 1521. If you do not, you must configure the LOCAL_LISTENER parameter in the intialization parameter file and resolve the listener name through a naming method.
http://download.oracle.com/docs/cd/B13789_01/network.101/b10775/listenercfg.htm
(5)解決問題(此處的T02為step 2的tnsnames.ora裡面的T02):
C:\Documents and Settings\Administrator>set oracle_sid=t02</p><p>C:\Documents and Settings\Administrator>sqlplus / as sysdba</p><p>SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 7月 24 22:21:55 2011</p><p>Copyright (c) 1982, 2005, Oracle. All rights reserved.</p><p>已串連到空閑常式。</p><p>SQL> select status,instance_name from v$instance;</p><p>STATUS INSTANCE_NAME<br />------------------------ --------------------------------<br />OPEN t02</p><p>SQL> alter system set local_listener="T02";</p><p>系統已更改。</p><p>SQL>
(6)驗證,再測試:
驗證,發現L1、L2已能正常註冊服務:
LSNRCTL> set curr L1<br />目前的監聽程式為 L1<br />LSNRCTL> status<br />正在串連到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=PC1255-20110528)(PORT=1522)))<br />LISTENER 的 STATUS<br />------------------------<br />別名 L1<br />版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production<br />啟動日期 24-7月 -2011 22:14:19<br />正常已耗用時間 0 天 0 小時 32 分 54 秒<br />追蹤層級 off<br />安全性 ON: Local OS Authentication<br />SNMP OFF<br />監聽程式參數檔案 D:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br />監聽程式記錄檔 D:\oracle\product\10.2.0\db_1\network\log\l1.log<br />監聽端點概要...<br /> (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PC1255-20110528)(PORT=1522)))<br />服務摘要..<br />服務 "t02" 包含 1 個常式。<br /> 常式 "t02", 狀態 READY, 包含此服務的 1 個處理常式...<br />服務 "t02XDB" 包含 1 個常式。<br /> 常式 "t02", 狀態 READY, 包含此服務的 1 個處理常式...<br />服務 "t02_XPT" 包含 1 個常式。<br /> 常式 "t02", 狀態 READY, 包含此服務的 1 個處理常式...<br />命令執行成功<br />LSNRCTL> set curr L2<br />目前的監聽程式為 L2<br />LSNRCTL> status<br />正在串連到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=PC1255-20110528)(PORT=1523)))<br />LISTENER 的 STATUS<br />------------------------<br />別名 L2<br />版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production<br />啟動日期 24-7月 -2011 22:14:19<br />正常已耗用時間 0 天 0 小時 33 分 6 秒<br />追蹤層級 off<br />安全性 ON: Local OS Authentication<br />SNMP OFF<br />監聽程式參數檔案 D:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br />監聽程式記錄檔 D:\oracle\product\10.2.0\db_1\network\log\l2.log<br />監聽端點概要...<br /> (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PC1255-20110528)(PORT=1523)))<br />服務摘要..<br />服務 "t02" 包含 1 個常式。<br /> 常式 "t02", 狀態 READY, 包含此服務的 1 個處理常式...<br />服務 "t02XDB" 包含 1 個常式。<br /> 常式 "t02", 狀態 READY, 包含此服務的 1 個處理常式...<br />服務 "t02_XPT" 包含 1 個常式。<br /> 常式 "t02", 狀態 READY, 包含此服務的 1 個處理常式...<br />命令執行成功<br />LSNRCTL>
再測試,發現scott使用者能夠正常登入:
C:\Documents and Settings\Administrator>sqlplus scott/tiger@t02</p><p>SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 7月 24 22:24:43 2011</p><p>Copyright (c) 1982, 2005, Oracle. All rights reserved.</p><p>串連到:<br />Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production<br />With the Partitioning, OLAP and Data Mining options</p><p>SQL>
(7)總結
當監聽的連接埠是預設的1521時,PMON會動態註冊該監聽(listener);
當監聽的連接埠不是預設的1521時,需要使用alter system set local_listener="T02";來手動註冊監聽。
Ref: http://warehouse.itpub.net/post/777/472788