Oracle數(shù)據(jù)庫是網(wǎng)絡(luò)數(shù)據(jù)庫的典型代表。用戶可以通過網(wǎng)絡(luò)來訪問Oracle數(shù)據(jù)庫。Oracle數(shù)據(jù)庫提供了網(wǎng)絡(luò)互聯(lián)的各種方案,包括結(jié)構(gòu)和驅(qū)動程序,其網(wǎng)絡(luò)通信協(xié)議結(jié)構(gòu)類似于OSI-RM,但又有自己的分層機制。也就是說,Oracle的網(wǎng)絡(luò)是基于計算機網(wǎng)絡(luò)的,通過網(wǎng)絡(luò)使Oracle實現(xiàn)了數(shù)據(jù)共享、數(shù)據(jù)完整性控制、數(shù)據(jù)安全傳輸、跨操作系統(tǒng)平臺(可以同時運行在Linux或者微軟的操作系統(tǒng)平臺上)、在多硬件平臺之間的數(shù)據(jù)相互操作。
那么是什么保障了Oracle網(wǎng)絡(luò)的連通性呢?簡單的說,是全局數(shù)據(jù)庫名、監(jiān)聽程序與網(wǎng)絡(luò)服務(wù)名這三架馬車保障了Oracle網(wǎng)絡(luò)的連通性。
第一架馬車:全局數(shù)據(jù)庫名。
在談到全局數(shù)據(jù)庫名之前,筆者要先談?wù)勥@個www.chinaitlab.com的域名。這個互聯(lián)網(wǎng)上的域名就相當于我們現(xiàn)實生活中的門牌號碼一樣,可以在紛繁蕪雜的網(wǎng)絡(luò)世界里準確無誤地把我們指引到我們要訪問的站點。從這個www.chinaitlab.com域名來看,它是由幾個不同的部分組成的。這幾個不同的部分彼此之間具有上下的層次關(guān)系。其中最后的.CN是域名的第一層,.COM是域名的第二層,而.Ctocio則是真正的域名,處在第三層,依次類推。至此我們可以看出域名從后到前的層次結(jié)構(gòu)類似于一個倒立的樹型結(jié)構(gòu)。其中第一層的.CN叫做地理頂級域名。在這些地理頂級域名下,還可以再根據(jù)需要定義次一級的域名。如在我國的頂級域名.CN下又設(shè)立了.COM,.NET,.ORG,.GOV,.EDU,以及我國各個行政區(qū)劃的字母代表如.BJ代表北京,.SH代表上海等等。故當訪問網(wǎng)站時,只需要輸入域名(www.chinaitlab.com)即可以打開相應(yīng)的網(wǎng)站,而不需要輸入難以記憶的IP地址。
而Oracle數(shù)據(jù)庫系統(tǒng)是一個大型的分布式數(shù)據(jù)庫系統(tǒng)。有時候出于性能等的考慮,往往需要在企業(yè)的多個地方部署多個數(shù)據(jù)庫系統(tǒng),這就構(gòu)成了Oracle分布式網(wǎng)絡(luò)環(huán)境。為了保障每個數(shù)據(jù)庫名字的唯一性,Oracle數(shù)據(jù)庫系統(tǒng)借鑒了域名的命名規(guī)則,使用域名結(jié)構(gòu)來命名分布在各地的數(shù)據(jù)庫。即一個數(shù)據(jù)庫的全局名字由其數(shù)據(jù)庫名和該數(shù)據(jù)庫所在的域名組成。假設(shè)現(xiàn)在某一家企業(yè)在浙江有寧波、杭州、舟山三個辦事處,分別部署了三個Oracle數(shù)據(jù)庫,其中杭州為總部。結(jié)構(gòu)圖如下:
根據(jù)全局數(shù)據(jù)庫名命名規(guī)則,杭州公司數(shù)據(jù)庫名字為ORAL.DTM 寧波公司的數(shù)據(jù)庫名字為ORAL.NINGBO.DTM,舟山公司的數(shù)據(jù)庫名字為ORAL.ZHOUZHAN.DTM。此時如果應(yīng)用程序要連接不同部門的得數(shù)據(jù)庫就非常的方便。可以通過全局數(shù)據(jù)庫名字來指定需要訪問的數(shù)據(jù)對象。只需要經(jīng)過簡單的修改,用戶就可以連接到所需要連接的數(shù)據(jù)庫。另為,還可以在網(wǎng)絡(luò)環(huán)境配置一個默認域,如此訪問默認域中的數(shù)據(jù)庫對象不需要指定域名。
利用全局數(shù)據(jù)庫名能夠起到兩個好處。一是易于數(shù)據(jù)庫進行擴充。如現(xiàn)在企業(yè)可能只用一個數(shù)據(jù)庫來處理業(yè)務(wù)。但是當企業(yè)規(guī)模擴大的時候,可能一個數(shù)據(jù)庫不能夠滿足性能上的需求。或者是因為企業(yè)合并等原因,需要部署分布式的數(shù)據(jù)庫環(huán)境。此時不需要更改原先的存在的數(shù)據(jù)庫,就可以對數(shù)據(jù)庫環(huán)境進行擴充。二是方便數(shù)據(jù)庫的連接。當用戶在不同的數(shù)據(jù)庫之間進行更換時,使用全局數(shù)據(jù)庫名將會非常的方便。
故筆者建議數(shù)據(jù)庫管理員,即使企業(yè)當前只有一臺Oracle數(shù)據(jù)庫時,最好對其進行命名時也能夠根據(jù)全局數(shù)據(jù)庫命名規(guī)則來定義其名字。以利益后續(xù)數(shù)據(jù)庫的擴充,同時也便于數(shù)據(jù)庫管理員的日常維護。
第二架馬車:網(wǎng)絡(luò)服務(wù)名。
當管理員利用conn system/system @tsh命令連接數(shù)據(jù)庫的時候,@后面的內(nèi)容就是網(wǎng)絡(luò)服務(wù)名。網(wǎng)絡(luò)服務(wù)名是數(shù)據(jù)庫服務(wù)器在客戶端的名稱。換句話說,就是數(shù)據(jù)庫的別名。通常情況下,一個數(shù)據(jù)庫可以有多個網(wǎng)絡(luò)服務(wù)名。網(wǎng)絡(luò)服務(wù)名主要用來將連接標識符解析為連接描述符,幫助客戶端應(yīng)用程序準確的連接到指定的數(shù)據(jù)庫服務(wù)器。一般來說,網(wǎng)絡(luò)服務(wù)器主要提供兩方面的信息。一是服務(wù)名稱,默認情況下服務(wù)名稱就是數(shù)據(jù)庫全局名稱;二是路由信息,即達到指定服務(wù)的網(wǎng)絡(luò)路由,或者說是監(jiān)聽程序的網(wǎng)絡(luò)地址。當應(yīng)用程序連接數(shù)據(jù)庫時,其連接字符串中的網(wǎng)絡(luò)服務(wù)名就指出了所需要連接到的數(shù)據(jù)庫服務(wù)器。另外,在客戶端上,也必須配置有于服務(wù)器協(xié)議地址相同的連接描述符才能夠向監(jiān)聽程序發(fā)出連接請求。
可見網(wǎng)絡(luò)服務(wù)名這架馬車,在Oracle網(wǎng)絡(luò)連接中就好像其起到一個馬夫手中皮鞭的作用,指揮著這輛馬車的前進方向。但是,這架馬車比較嬌貴,動不動就會出現(xiàn)問題。
如當某個客戶端非正常關(guān)機后,重新啟動。可能會發(fā)現(xiàn)無法正常連接到客戶端,提示網(wǎng)絡(luò)服務(wù)器名錯誤而無法正常連接到客戶端。再如有時候會因為無法解析全局數(shù)據(jù)庫名字而客戶端無法連接到數(shù)據(jù)庫。為了防止網(wǎng)絡(luò)服務(wù)名出現(xiàn)錯誤,筆者有以下幾個建議。
一是網(wǎng)絡(luò)服務(wù)名的信息通常情況下是保存在TNSNAMES.ORA這個文件中。如果意外關(guān)機等情況,這個文件中的信息可能會丟失。為此最好對這個文件進行獨立的備份。在遇到因為網(wǎng)絡(luò)服務(wù)名錯誤而無法連接到數(shù)據(jù)庫的時候,可以先利用這個文件進行恢復(fù)。通常情況下,都可以解決問題。
二是最好不要手工更改這個文件。雖然這個文件看起來比較簡單,但是修改起來比較麻煩。除非你是這方面的專家,否則的話最好不要手工更改這文件。通常情況下,最好采用Oracle數(shù)據(jù)庫自帶的工具來配置。筆者建議的作法是,先利用TNS工具把原先的配置文件刪除,然后再重新建立一個。這是一個不錯的選擇。
三是當客戶端與Oracle數(shù)據(jù)庫服務(wù)器進行連接的時候,如果出現(xiàn)提示網(wǎng)絡(luò)服務(wù)器的錯誤提示時(監(jiān)聽程序無法找到適用于客戶機連接的例程),有部分原因是無法解析數(shù)據(jù)庫全局名所造成的。此時,管理員可以嘗試著修改這個文件中的全局數(shù)據(jù)庫名。即把全局數(shù)據(jù)庫名修改為數(shù)據(jù)庫服務(wù)器對應(yīng)的IP地址。如果幸運的話,這么修改后就可以解決客戶端的連接問題了。
另外需要注意,有時候系統(tǒng)提示網(wǎng)絡(luò)服務(wù)名錯誤無法連接到數(shù)據(jù)庫時,有可能不是網(wǎng)絡(luò)服務(wù)名錯誤所造成。有可能使其他的原因。如有時候如果存在防火墻,系統(tǒng)也會提示這個錯誤信息。如一次用戶在Linux系統(tǒng)上安裝Oralce數(shù)據(jù)庫。而默認情況下,Linux系統(tǒng)的防火墻是開啟的。在事后沒有個防火墻關(guān)閉,導(dǎo)致Oralce無法正常連接。Oracle數(shù)據(jù)庫并不是不能夠通過防火墻,而是需要在防火墻上進行額外的設(shè)置。故如果是出于學(xué)習(xí)的需要,筆者建議可以先把Linux等操作系統(tǒng)的防火墻服務(wù)暫時關(guān)閉掉。
第三架馬車:監(jiān)聽程序。
監(jiān)聽程序是運行在服務(wù)器端的一個單獨的服務(wù)進程。他的作用就是通過監(jiān)聽端口,監(jiān)聽網(wǎng)絡(luò)上的客戶機對服務(wù)器的連接請求,并管理客戶機與服務(wù)器之間的網(wǎng)絡(luò)通信量。如果做一個形象的比喻,監(jiān)聽程序就好像是賓館前面的保安。看到有客人來了,就開門來其進去。如果客人沒付錢就走人,保安就會攔住客戶不讓其走。監(jiān)聽程序其的作用就是跟這個保安的作用非常類似。每次客戶端請求連接服務(wù)器時,監(jiān)聽程序就會第一時間接收到這個請求。然后監(jiān)聽程序會把這個請求匯報給服務(wù)器。另外,監(jiān)聽程序還會對用戶的合法性做出辨別。如果客戶端提供的連接信息與監(jiān)聽程序保存在配置文件中的信息(如協(xié)議、端口、數(shù)據(jù)庫等等信息)匹配的話,則監(jiān)聽程序就授權(quán)客戶機連接到服務(wù)器。否則的話,就會拒絕客戶機的連接請求。可見,監(jiān)聽程序這架馬車,在數(shù)據(jù)庫連接中起著舉足輕重的作用。
當服務(wù)器端的監(jiān)聽程序沒有正常啟動時,客戶端將無法通過網(wǎng)絡(luò)連接到數(shù)據(jù)庫服務(wù)器。