一、Oracle客戶端與服務器端的通訊機制
1、OracleNet協議
如下圖所示,Oracle通過Oracle Net協議實現客戶端與服務器端的連接以及數據傳遞。OracleNet是同時駐留在Oracle數據庫服務器端和客戶端上的一個軟件層,它封裝了TCP/IP協議,負責建立與維護客戶端應用程序到數據庫服務器的連接。
如下圖所示,客戶端發出的請求首先通過OracleNet協議轉換,轉換成可以通過網絡傳輸的信息,通過TCP/IP網絡將請求傳輸到數據庫服務器端;服務器端接受到客戶請求後要通過OracleNet協議轉換,將請求轉換成數據庫可以解釋執行的本地指令,並在服務器端執行(主要是一些輸入輸出操作),並將結果通過TCP/IP協議和OracleNet協議傳輸給客戶端顯示。
2、客戶端與服務器端的連接過程
在分析客戶端與服務器端的連接機制之前,先要定義兩個概念,一個是Oracle監聽器,一個是Oracle網絡服務名。
Oracle數據庫服務器通過一個名為“OracleNet監聽器”的組件接收來自客戶端的連接請求。監聽器是位於服務器端的一個後台進程,發送給數據庫的客戶端連接請求,首先被服務器端的監聽器所偵聽,並將請求所轉交給對應的數據庫實例,從而建立起客戶端與服務器的連接。連接建立後,客戶端與服務器端就可以直接進行通訊,不再需要監聽器參與。
要實現監聽器對客戶請求的監聽,需要對監聽器進行配置,包括監聽端口、監聽器所在數據庫的全局數據庫名稱、數據庫實例等信息。
Oracle網絡服務名是一個標識符,它代表著客戶端連接服務器的配置信息(實際上就是連接請求的內容),包括數據庫主機地址、監聽端口、全局數據庫名稱等內容((有關全局數據庫、數據庫實例等,請參考Oracle數據庫安裝部分)。
如圖所示,客戶端與服務端的連接過程為:
(1)首先在服務器端有一個常駐的監聽器(監聽服務要打開)監聽客戶端發出的連接請求。
(2)用戶在客戶端(企業服務器或SQL工具)輸入用戶名、口令及網絡服務名,或在SQL命令行中輸入類似“CONNECTusername/password@net_Service_name”的類似請求。
(3)客戶端查看網絡服務配置文件tnsname.ora,將網絡服務名映射為包含Oracle服務器地址、監聽端口和全局數據庫名的連接描述符。
(4)客戶端根據連接描述符定位監聽器,並通過網絡將連接信息傳遞給監聽器。
(5)監聽器查詢監聽配置文件listener.ora,找出所要連接的數據庫服務器。
(6)客戶機和服務器開始通信。
二、監聽器配置
1、添加和配置監聽器
如下圖所示使用Oracle Net Configuration Asistant工具添加並配置服務器的監聽器:
監聽程序配置完成後,數據庫系統會自動啟動該監聽器。
添加和配置監聽器後也可以使用Oracle NetManager工具查看和修改監聽器配置,如監聽位置、監聽器所服務的全局數據庫名稱等。如下圖所示:
對於本安裝,監聽器配置信息記錄在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)
)
)
三、客戶端工具的安裝與網絡服務的配置
可以在不同於數據庫主機的其它機器安裝客戶端工具,並通過配置客戶端網絡服務,連接到數據庫服務器。客戶端安裝與配置過程如下圖所示(本安裝將客戶端安裝在了與數據庫同一台機器的不同目錄中,模擬遠程訪問數據庫的情況):
在安裝了客戶端並配置了客戶端網絡服務名之後就可以從客戶端工具登錄和訪問遠端數據庫服務器了。對於本安裝,客戶端網絡服務配置記錄在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)
)
)
這樣,當在客戶端工具中輸入網絡服務名remotedb時,將被解析為數據庫地址、端口、全局數據庫名等信息,與輸入的用戶名、密碼一起發送到服務器端,由監聽器接收,並與監聽配置文件對照,將請求轉交給相應的數據庫實例處理。
客戶端網絡服務可以使用客戶端的Oracle Net Manager工具進行修改,也可以添加新的客戶端網絡服務名。
需要指出的是:
服務器端的客戶工具(SQL PLUS、企業管理控制台等)與數據庫服務的連接機制與遠程客戶端連接是一樣的。
在安裝完Oracle數據庫後,系統默認在數據庫服務器本地安裝了SQLPLUS等客戶端工具,而且在監聽配置文件的相同位置E:\Oracle_Server\oracle\ora92\network\admin文件夾中默認提供了服務器端的網絡服務連接配置文件tnsnames.ora,其中包含一個與數據庫實例SID同名的網絡服務名配置,包括數據庫所在主機名或ip地址、監聽端口、數據庫服務名(全局數據庫名)等。對於本安裝,該tnsnames.ora文件主要內容如下:
MYDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = tsinghua-p5z3mm)(PORT =1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mydb.bawei)
)
)
當使用數據庫服務器端的客戶工具時,和從遠程客戶機連接服務器一樣,也是根據輸入的用戶名、密碼及網絡服務名(或類似CONNECTusername/password@net_Service_name的SQL命令行),查找tnsnames.ora文件,找到網絡連接服務名等於net_Service_name的一項,並獲取數據庫主機地址、監聽端口、全局數據庫名等信息。
該請求信息同樣被傳輸到監聽端口,監聽器再將該信息與同在文件夾E:\Oracle_Server\oracle\ora92\network\admin中的listener.ora監聽器配置文件對照,如果listener.ora監聽器配置文件中包含匹配的項,則將該請求轉給對應的數據庫實例。
由此可見,服務器端的客戶端工具與數據庫服務的連接與遠程客戶端連接一樣,執行了相同的的過程。
實際上,服務器端的客戶工具是通過服務器端tnsnames.ora和listener.ora進行驗證並建立連接;遠程客戶端是通過客戶端的tnsnames.ora和服務器端的listener.ora執行驗證和建立連接。