一、Oracle客戶(hù)端與服務(wù)器端的通訊機制
1、OracleNet協(xié)議
如下圖所示,Oracle通過(guò)Oracle Net協(xié)議實(shí)現客戶(hù)端與服務(wù)器端的連接以及數據傳遞。OracleNet是同時(shí)駐留在Oracle數據庫服務(wù)器端和客戶(hù)端上的一個(gè)軟件層,它封裝了TCP/IP協(xié)議,負責建立與維護客戶(hù)端應用程序到數據庫服務(wù)器的連接。
如下圖所示,客戶(hù)端發(fā)出的請求首先通過(guò)OracleNet協(xié)議轉換,轉換成可以通過(guò)網(wǎng)絡(luò )傳輸的信息,通過(guò)TCP/IP網(wǎng)絡(luò )將請求傳輸到數據庫服務(wù)器端;服務(wù)器端接受到客戶(hù)請求后要通過(guò)OracleNet協(xié)議轉換,將請求轉換成數據庫可以解釋執行的本地指令,并在服務(wù)器端執行(主要是一些輸入輸出操作),并將結果通過(guò)TCP/IP協(xié)議和OracleNet協(xié)議傳輸給客戶(hù)端顯示。

2、客戶(hù)端與服務(wù)器端的連接過(guò)程
在分析客戶(hù)端與服務(wù)器端的連接機制之前,先要定義兩個(gè)概念,一個(gè)是Oracle監聽(tīng)器,一個(gè)是Oracle網(wǎng)絡(luò )服務(wù)名。
Oracle數據庫服務(wù)器通過(guò)一個(gè)名為“OracleNet監聽(tīng)器”的組件接收來(lái)自客戶(hù)端的連接請求。監聽(tīng)器是位于服務(wù)器端的一個(gè)后臺進(jìn)程,發(fā)送給數據庫的客戶(hù)端連接請求,首先被服務(wù)器端的監聽(tīng)器所偵聽(tīng),并將請求所轉交給對應的數據庫實(shí)例,從而建立起客戶(hù)端與服務(wù)器的連接。連接建立后,客戶(hù)端與服務(wù)器端就可以直接進(jìn)行通訊,不再需要監聽(tīng)器參與。
要實(shí)現監聽(tīng)器對客戶(hù)請求的監聽(tīng),需要對監聽(tīng)器進(jìn)行配置,包括監聽(tīng)端口、監聽(tīng)器所在數據庫的全局數據庫名稱(chēng)、數據庫實(shí)例等信息。
Oracle網(wǎng)絡(luò )服務(wù)名是一個(gè)標識符,它代表著(zhù)客戶(hù)端連接服務(wù)器的配置信息(實(shí)際上就是連接請求的內容),包括數據庫主機地址、監聽(tīng)端口、全局數據庫名稱(chēng)等內容((有關(guān)全局數據庫、數據庫實(shí)例等,請參考Oracle數據庫安裝部分)。
如圖所示,客戶(hù)端與服務(wù)端的連接過(guò)程為:
(1)首先在服務(wù)器端有一個(gè)常駐的監聽(tīng)器(監聽(tīng)服務(wù)要打開(kāi))監聽(tīng)客戶(hù)端發(fā)出的連接請求。
(2)用戶(hù)在客戶(hù)端(企業(yè)服務(wù)器或SQL工具)輸入用戶(hù)名、口令及網(wǎng)絡(luò )服務(wù)名,或在SQL命令行中輸入類(lèi)似“CONNECTusername/password@net_Service_name”的類(lèi)似請求。
(3)客戶(hù)端查看網(wǎng)絡(luò )服務(wù)配置文件tnsname.ora,將網(wǎng)絡(luò )服務(wù)名映射為包含Oracle服務(wù)器地址、監聽(tīng)端口和全局數據庫名的連接描述符。
(4)客戶(hù)端根據連接描述符定位監聽(tīng)器,并通過(guò)網(wǎng)絡(luò )將連接信息傳遞給監聽(tīng)器。
(5)監聽(tīng)器查詢(xún)監聽(tīng)配置文件listener.ora,找出所要連接的數據庫服務(wù)器。
(6)客戶(hù)機和服務(wù)器開(kāi)始通信。
二、監聽(tīng)器配置
1、添加和配置監聽(tīng)器
如下圖所示使用Oracle Net Configuration Asistant工具添加并配置服務(wù)器的監聽(tīng)器:


監聽(tīng)程序配置完成后,數據庫系統會(huì )自動(dòng)啟動(dòng)該監聽(tīng)器。
添加和配置監聽(tīng)器后也可以使用Oracle NetManager工具查看和修改監聽(tīng)器配置,如監聽(tīng)位置、監聽(tīng)器所服務(wù)的全局數據庫名稱(chēng)等。如下圖所示:

對于本安裝,監聽(tīng)器配置信息記錄在E:\Oracle_Server\oracle\ora92\network\admin\listener.ora文件中。其主要內容如下:
LISTENER=
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = tsinghua-p5z3mm)(PORT =1521))
)
)
)
SID_LIST_LISTENER =
(SID_LIST=
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:\Oracle_Server\oracle\ora92)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = mydb.bawei)
(ORACLE_HOME = E:\Oracle_Server\oracle\ora92)
(SID_NAME = mydb)
)
)
三、客戶(hù)端工具的安裝與網(wǎng)絡(luò )服務(wù)的配置
可以在不同于數據庫主機的其它機器安裝客戶(hù)端工具,并通過(guò)配置客戶(hù)端網(wǎng)絡(luò )服務(wù),連接到數據庫服務(wù)器??蛻?hù)端安裝與配置過(guò)程如下圖所示(本安裝將客戶(hù)端安裝在了與數據庫同一臺機器的不同目錄中,模擬遠程訪(fǎng)問(wèn)數據庫的情況):

在安裝了客戶(hù)端并配置了客戶(hù)端網(wǎng)絡(luò )服務(wù)名之后就可以從客戶(hù)端工具登錄和訪(fǎng)問(wèn)遠端數據庫服務(wù)器了。對于本安裝,客戶(hù)端網(wǎng)絡(luò )服務(wù)配置記錄在E:\Oracle_Client\oracle\ora92\network\admin\tnsnames.ora文件中,其主要內容如下:
REMOTEDB=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.6)(PORT =1521))
)
(CONNECT_DATA =
(SERVICE_NAME = mydb.bawei)
)
)
這樣,當在客戶(hù)端工具中輸入網(wǎng)絡(luò )服務(wù)名remotedb時(shí),將被解析為數據庫地址、端口、全局數據庫名等信息,與輸入的用戶(hù)名、密碼一起發(fā)送到服務(wù)器端,由監聽(tīng)器接收,并與監聽(tīng)配置文件對照,將請求轉交給相應的數據庫實(shí)例處理。
客戶(hù)端網(wǎng)絡(luò )服務(wù)可以使用客戶(hù)端的Oracle Net Manager工具進(jìn)行修改,也可以添加新的客戶(hù)端網(wǎng)絡(luò )服務(wù)名。
需要指出的是:
服務(wù)器端的客戶(hù)工具(SQL PLUS、企業(yè)管理控制臺等)與數據庫服務(wù)的連接機制與遠程客戶(hù)端連接是一樣的。
在安裝完Oracle數據庫后,系統默認在數據庫服務(wù)器本地安裝了SQLPLUS等客戶(hù)端工具,而且在監聽(tīng)配置文件的相同位置E:\Oracle_Server\oracle\ora92\network\admin文件夾中默認提供了服務(wù)器端的網(wǎng)絡(luò )服務(wù)連接配置文件tnsnames.ora,其中包含一個(gè)與數據庫實(shí)例SID同名的網(wǎng)絡(luò )服務(wù)名配置,包括數據庫所在主機名或ip地址、監聽(tīng)端口、數據庫服務(wù)名(全局數據庫名)等。對于本安裝,該tnsnames.ora文件主要內容如下:
MYDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = tsinghua-p5z3mm)(PORT =1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mydb.bawei)
)
)
當使用數據庫服務(wù)器端的客戶(hù)工具時(shí),和從遠程客戶(hù)機連接服務(wù)器一樣,也是根據輸入的用戶(hù)名、密碼及網(wǎng)絡(luò )服務(wù)名(或類(lèi)似CONNECTusername/password@net_Service_name的SQL命令行),查找tnsnames.ora文件,找到網(wǎng)絡(luò )連接服務(wù)名等于net_Service_name的一項,并獲取數據庫主機地址、監聽(tīng)端口、全局數據庫名等信息。
該請求信息同樣被傳輸到監聽(tīng)端口,監聽(tīng)器再將該信息與同在文件夾E:\Oracle_Server\oracle\ora92\network\admin中的listener.ora監聽(tīng)器配置文件對照,如果listener.ora監聽(tīng)器配置文件中包含匹配的項,則將該請求轉給對應的數據庫實(shí)例。
由此可見(jiàn),服務(wù)器端的客戶(hù)端工具與數據庫服務(wù)的連接與遠程客戶(hù)端連接一樣,執行了相同的的過(guò)程。
實(shí)際上,服務(wù)器端的客戶(hù)工具是通過(guò)服務(wù)器端tnsnames.ora和listener.ora進(jìn)行驗證并建立連接;遠程客戶(hù)端是通過(guò)客戶(hù)端的tnsnames.ora和服務(wù)器端的listener.ora執行驗證和建立連接。