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