一、配置初衷
oracle雖然用了多年,但是一直僅僅是用而已,沒有深入看過oracle的東東。第一次,自己在服務器上完整創建並且配置一個oracle服務器,問題馬上就出現了:
有關詳細資料 , 請參閱 D :\Oracle\cfgtoollogs\dbca\orcl\emConfig.log 中的日志文件。
很快在網上搜索到以下一篇文章:
http://blueaeri.iteye.com/blog/676041
標題很誘人,但是始終沒有解決。(ps:也可能是我自身問題)
所以,決定拎起袖子,跨界學習一下oracle中的監聽器吧。
二、監聽器的原理理解
關於監聽器的理解,不妨可以參考這篇文章:http://www.360doc.com/content/11/0412/10/6670178_109025796.shtml。
以下,就談談我自己的淺薄的理解吧:
首先,我覺得監聽器的設計使用了代理模式,而監聽器正正是代理模式中所描述的代理。當客戶端對數據庫發生請求的時候,監聽器就作為這個客戶端的代理,發出對數據庫實例的請求。當數據庫實例的server 進程收到監聽器轉發過來的請求時候,會做出響應。而這個響應也是通過監聽器轉發給客戶端。不難發現,客戶端與數據庫實例之間的交互是間接完成的,在他們中間就存在着一個中間人-監聽器。
但是,有一點我們需要注意的,客戶端永遠不知道他請求的數據庫實例是什么,唯一知道的只是數據庫所在的服務器的某個服務的名字以及這個數據庫分配給他的用戶名和密碼。這就好比我們去買蘋果產品,我們買的時候去的只是代理商的店面,只知道產品是蘋果公司賣的,但產品到底是由哪家代工公司生產的,作為消費者的我們一無所知。
但是,歸根到底,總該有那么一個機制,負責維護“服務”,“監聽器”,“數據庫實例”三者之間的關系吧。答案是有的,請看下面的內容。
三、相應的三個配置文件:sqlnet.ora,tnsnames.ora,listener.ora(路徑:$oracle_home\NETWORK\ADMIN;默認情況下安裝的話,大概如此:D:\app\Administrator\product\11.2.0\dbhome_2\NETWORK\ADMIN)
考慮一下,以下的一種情況:
假如,我們需要連接到一個數據庫上的名字為mzoa的實例並且這個數據庫實例里面有一個密碼為:a,用戶名為:sysman的賬號。但是,我們不知道這個數據庫實例的名字,只知道這個數據庫服務器向外提供了一個名為“mzoa”的“服務”,至於我們需要請求的數據庫的實例的名字是什么,我們一無所知。但是,盡管如此,我們還是能夠連接上我們需要找到的數據庫實例-mzoa。(ps:實例名字“mzoa”與服務名字“mzoa”不是必然相同的,可以在創建實例的時候加以修改的!)
不信?可以看看下面……
我們可以在cmd里面完成以下的連接操作:
SQL *Plus : Release 11. 2. 0. 1. 0 Production on 星期二 9月 27 14: 15: 16 2011
Copyright (c ) 1982, 2010, Oracle. All rights reserved.
連接到 :
Oracle Database 11g Enterprise Edition Release 11. 2. 0. 1. 0 - Production
With the Partitioning , OLAP , Data Mining and Real Application Testing options
SQL >
至於為什么能這樣子?我想上面的三個配置文件:sqlnet.ora,tnsnames.ora,listener.ora足以說明問題。
我們先將這三個配置文件分分類。sqlnet.ora,tnsnames.ora屬於客戶端,listener.ora屬於服務器端。
第一類,客戶端文件:sqlnet.ora,tnsnames.ora
在我們上面的操作過程中,我們使用了以下的語句:
“I_AM_SERIVCE”不是一個“服務”的名字,但是至於這個名字有什么內涵。我們需要oracle客戶端做出解釋。(注意:這里的oracle客戶端指的是oracle客戶端軟件對應的進程集)
oracle客戶端是這樣子完成對“I_AM_SERIVCE”這一個名字作出解釋的:
步驟一:
查看sqlnet.ora配置文件,內容如下:
NAMES.DIRECTORY_PATH = (TNSNAMES ,HOSTNAME ,EZCONNECT )
其中第二個條目NAMES.DIRECTORY_PATH,從左至右,指示首先由哪些文件來解釋名字。
如上面的例子,就是指示,先由TNSNAMES.ora文件,然后是客戶端所在系統的hosts文件……解釋名字
步驟二:
因為,sqlnet.ora文件指出先由TNSNAMES.ora文件解釋。
我們查看TNSNAMES.ora文件,里面關於“I_AM_SERIVCE”有以下的內容:
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP )(HOST = 127. 0. 0. 1) (PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED )
(SERVICE_NAME = mzoa )
)
)
在這里我們可以清晰看到關於這個“I_AM_SERIVCE”的名字的詳細信息了。通過這個名字,我們可以請求數據庫服務器所在地址:127.0.0.1,“服務”的名字是“mzoa”。
而端口號:1521正是我們這篇文章的主人公監聽器(listener)正在監聽的端口號。
通過以上信息,我們可以知道客戶端的請求可以通過訪問服務器“服務”的形式發送到監聽器(listener)上。
第二類,服務器端:listener.ora。
內容以及解釋如下:
# Generated by Oracle configuration tools.
#下面定義監聽器(LISTENER)進程為哪個實例提供服務
#revised by kaiwii
SID_LIST_LISTENER =
(SID_LIST =
#實例描述條目 1:
(SID_DESC = #被提供服務的實例;desc :description
(SID_NAME = CLRExtProc )
(ORACLE_HOME = D :\app\Administrator\product\ 11. 2. 0\dbhome_2 )
(PROGRAM = extproc )
(ENVS = "EXTPROC_DLLS=ONLY:D:\app\Administrator\product\11.2.0\dbhome_2\bin\oraclr11.dll" )
)
#實例描述條目 2:
(SID_DESC = #被提供服務的實例;desc :description
(SID_NAME = mzoa )
(ORACLE_HOME = D :\app\Administrator\product\ 11. 2. 0\dbhome_2 )
(GLOBAL_DBNAME = mzoa )
)
)
#一台數據庫可以有不止一個監聽器。接下來是,其中一個監聽器的詳細描述。
#這個監聽器的名字為“LISTENER”,通過 “LISTENER =”來指定。
#再向下面就是指定監聽器(“LISTENER”)所監聽的位置(位置可以不止一個)。而某一個位置,我們可以通過
#設定監聽的協議,ip,端口等信息來指明。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC )(KEY = EXTPROC1521 ))
(ADDRESS = (PROTOCOL = TCP )(HOST = 127. 0. 0. 1) (PORT = 1521) )
(ADDRESS = (PROTOCOL = TCP )(HOST = SuDa - 20110705FF) (PORT = 1521) )
)
)
ADR_BASE_LISTENER = D :\app\Administrator
從中,我們不難發現,其實客戶端中考究的“服務”名字貌似在服務器端不起什么作用。監聽器都是通過監聽某個host下的端口,得到客戶端發來的請求的,然后,再將此請求發送到實例中去的。但是,到底是不是這回事。希望看到這篇文章的朋友,可以跟我交流一下。
三、修改監聽器的信息
具體步驟,可以參考這篇文章:
oracle: listener.ora 、sqlnet.ora 、tnsnames.ora的配置及例子
接下來,就說說我自己的一些看法。
1、每次修改監聽器所涉及到的三個配置文件:sqlnet.ora,tnsnames.ora,listener.ora,必須首先關閉監聽器,修改成功后再打開。
具體做法:a、windows用戶可以通過關閉/開啟服務的方式完成b、通過命令的方式
2、推薦通過修改配置文件的方式,完成修改工作。
好吧,就說這些,希望上面的內容對你有用!!!!!!!