【一】對(duì)ORACLE_SID的理解
Oracle中SID的作用類(lèi)似于一個(gè)“開(kāi)關(guān)變量”---引導(dǎo)Oracle在實(shí)例啟動(dòng)時(shí)如何去默認(rèn)位置下讀取適當(dāng)?shù)膮?shù)文件并加載,以正確啟動(dòng)實(shí)例。
我們知道實(shí)例的啟動(dòng)需要指定pfile/spfile(Oracle9i之前是使用pfile--即init文件,從9i開(kāi)始就默認(rèn)使用spfile--即服務(wù)器端參數(shù)文件,兩者的不同請(qǐng)參考《Oracle 10g Concept》手冊(cè),關(guān)鍵在于修改其中參數(shù)后是否會(huì)自動(dòng)持久化)。這兩個(gè)文件的存放位置為:
A.pfile:名字為init<ORACLE_SID>.ora
B.spfile:名字為spfile<ORACLE_SID>.ora
我們看到init文件和spfile文件都帶有ORACLE_SID的標(biāo)識(shí),這就是SID的作用了:
【1】當(dāng)我們要啟動(dòng)一個(gè)實(shí)例時(shí),我們首先通過(guò):set ORACLE_SID = XXX 或者export ORACLE_SID = XXX 的方式告訴Oracle接下來(lái)要啟動(dòng)的實(shí)例
【2】當(dāng)我們執(zhí)行startup nomount時(shí),由于已經(jīng)指定了SID,那么Oracle知道了如何去默認(rèn)的目錄下查找該實(shí)例對(duì)應(yīng)的參數(shù)文件--就是靠SID去匹配每個(gè)init/spfile文件
【3】當(dāng)Oracle找到該文件后(init/spfile),就會(huì)讀取該文件的內(nèi)容,將一系列參數(shù)用于分配內(nèi)存空間,構(gòu)建后臺(tái)進(jìn)程等實(shí)例的啟動(dòng)過(guò)程
【4】當(dāng)這個(gè)實(shí)例成功啟動(dòng)后,我們又可以重新執(zhí)行 set ORACLE_SID = XXX 或 export ORACLE_SID = XXX 命令再次將“開(kāi)關(guān)撥向”另一個(gè)SID,然后重復(fù)以上步驟
從上面的過(guò)程我們看到Oracle SID的作用是一個(gè)明顯的“開(kāi)關(guān)變量”,它拔向那一邊,那么Oracle就會(huì)去找和它對(duì)應(yīng)的參數(shù)文件來(lái)啟動(dòng)實(shí)例。其次SID也起到進(jìn)程隔離的作用--即SID會(huì)在實(shí)例的一系列后臺(tái)進(jìn)程中得到體現(xiàn),如ora_dbw0_paullin,ora_dbw0_boblin。通過(guò)SID來(lái)命名后臺(tái)進(jìn)程。
操作系統(tǒng)也必須通過(guò)SID來(lái)和Oracle實(shí)例打交道,操作系統(tǒng)并不知道什么INSTANCE_NAME,只知道ORACLE_SID,在Oracle內(nèi)部由Oracle自己根據(jù)這個(gè)SID去識(shí)別不同的實(shí)例。所以O(shè)RACLE_SID更多的是“Oracle和外部操作系統(tǒng)溝通的一個(gè)窗口”。
【二】對(duì)INSTANCE_NAME的理解
相比于ORACLE_SID這樣的“開(kāi)關(guān)變量”,INSTANCE_NAME則是一個(gè)實(shí)實(shí)在在的參數(shù)。它是在init/pfile文件中配置的(db_name)。用于標(biāo)識(shí)數(shù)據(jù)庫(kù)實(shí)例的名稱(chēng),其缺省值就是ORACLE_SID。
INSTANCE_NAME就像一個(gè)人的名稱(chēng)一樣,而SID則是這個(gè)人的身份證號(hào)碼。通過(guò)SID我們找到對(duì)應(yīng)的init/spfile文件,而init/spfile文件中又通過(guò)instance_name這個(gè)參數(shù)告訴我們對(duì)應(yīng)的實(shí)例叫什么名字。這樣就把ORACLE_SID、參數(shù)文件、INSTANCE_NAME聯(lián)系起來(lái)了。
造成ORACLE_SID不同,但I(xiàn)NSTANCE_NAME相同的原因通常是因?yàn)閺?fù)制了原有的參數(shù)文件,但忘記了修改其中的INSTANCE_NAME參數(shù)的值。不過(guò)在10G之后INSTANCE_NAME這個(gè)參數(shù)以及從init/spfile中消失了,以免引起混亂。
【三】對(duì)DB_NAME的理解
我們已經(jīng)知道了ORACLE_SID是一個(gè)“開(kāi)關(guān)變量”,INSTANCE_NAME是用來(lái)描述實(shí)例的。那么DB_NAME則是描述實(shí)例掛載的數(shù)據(jù)庫(kù)名稱(chēng),通過(guò)這個(gè)DB_NAME我們可以知道對(duì)應(yīng)的磁盤(pán)上的控制文件、日志文件、數(shù)據(jù)文件的位置。
DB_NAME在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)被指定,默認(rèn)情況下和ORACLE_SID的名字一樣。但和INSTANCE_NAME一樣。DB_NAME一旦被確定下來(lái)就不能修改了,因?yàn)樗鼤?huì)同時(shí)存儲(chǔ)在init/spfie,控制文件,日志文件,數(shù)據(jù)文件。你只能修改init/spfile文件中DB_NAME參數(shù)的值,但是不能手工修改其它文件的值。所以一旦修改后引起幾個(gè)文件的值不匹配那么數(shù)據(jù)庫(kù)的啟動(dòng)就會(huì)失敗。
A.一個(gè)實(shí)例可以MOUNT并打開(kāi)任何數(shù)據(jù)庫(kù)(通過(guò)init/spfile中配置DB_NAME參數(shù)),但是同一時(shí)間一個(gè)實(shí)例只能打開(kāi)一個(gè)數(shù)據(jù)庫(kù)。
B.一個(gè)數(shù)據(jù)庫(kù)可以被一個(gè)或多個(gè)實(shí)例所MOUNT并打開(kāi)(只能是在RAC環(huán)境下,普通環(huán)境下一個(gè)數(shù)據(jù)庫(kù)只能同時(shí)被一個(gè)實(shí)例MOUNT并打開(kāi))。
那么如何知道實(shí)例應(yīng)該掛載到那個(gè)數(shù)據(jù)庫(kù)并打開(kāi)呢?就是靠init/spfile中的“control_files”參數(shù)來(lái)告訴Oracle去那里讀取控制文件,而控制文件中又記錄了數(shù)據(jù)文件的位置。所以最終形成一個(gè)完整的鏈條:
ORACLE_SID --> init/spfile文件 --> instance_name、db_name、control_files --> 實(shí)例名、數(shù)據(jù)庫(kù)名、控制文件 --> 數(shù)據(jù)文件 --> 完成掛載并打開(kāi)
【四】ORACLE_SID、INSTANCE_NAME、DB_NAME對(duì)應(yīng)關(guān)系
我們已經(jīng)知道ORACLE_SID是用來(lái)隔離同一個(gè)ORACLE_HOME下不同的實(shí)例的。但對(duì)于不同的ORACLE_HOME呢?能否有相同名稱(chēng)的SID呢?
實(shí)際上這就和文件系統(tǒng)的規(guī)則是一樣的:在同一個(gè)目錄下不允許有同名的文件存在,但不同的目錄下可以有同名的文件。同樣的在同一個(gè)ORACLE_HOME下不能有相同的SID存在,而不同的ORACLE_HOME下可以有重名的SID(即便是同一臺(tái)機(jī),只要ORACLE_HOME不同就可以)。
那么對(duì)于INSTANCE_NAME呢?默認(rèn)情況下INSTANCE_NAME和ORACLE_SID是相同的,也可以是不同的;而且不同的實(shí)例可以具有相同的實(shí)例名。這聽(tīng)起來(lái)有點(diǎn)混亂是不?其實(shí)我們可以用一個(gè)簡(jiǎn)單的生活化例子來(lái)解析:
在一個(gè)班級(jí)Class_1里面,有兩個(gè)學(xué)生,他們的名稱(chēng)都叫張三,但他們的學(xué)號(hào)肯定不同。在這里“張三”就是INSTANCE_NAME,而學(xué)號(hào)就是SID。所以INSTANCE_NAME重復(fù)沒(méi)關(guān)系,只要SID不同就可以區(qū)分開(kāi)來(lái)。
但是在另外一個(gè)班級(jí)Class_2里面,也有學(xué)號(hào)相同的學(xué)生,這時(shí)候就出現(xiàn)了我們說(shuō)的SID相同的問(wèn)題,那么如何區(qū)分呢?別忘了我們還有班級(jí)這個(gè)概念啊!對(duì)應(yīng)于ORACLE就是ORACLE_HOME了。
至于INSTANCE_NAME和DB_NAME的對(duì)應(yīng)關(guān)系,這個(gè)很好理解了,不同的實(shí)例可以掛載到不同的DB,也可以掛載到相同的DB嘛。可以把這理解為“多個(gè)進(jìn)程同時(shí)對(duì)同一份磁盤(pán)文件的競(jìng)爭(zhēng)性訪問(wèn)”。
A. 相同ORACLE_HOME下,INSTANCE_NAME可以相同,但ORACLE_SID必須唯一。通過(guò)ORACLE_SID來(lái)區(qū)分不同的實(shí)例
B. 不同ORACLE_HOME下,ORACLE_SID可以相同,通過(guò)ORACLE_HOME來(lái)區(qū)分不同的SID
C.不同INSTANCE_NAME可以對(duì)應(yīng)不同的DB_NAME,也可以對(duì)應(yīng)相同的DB_NAME。但是如果不是在RAC環(huán)境下,只能同時(shí)啟動(dòng)實(shí)例而不能同時(shí)掛載
【五】Oracle實(shí)例啟動(dòng)過(guò)程的相關(guān)參數(shù)文件
前面說(shuō)到Oracle實(shí)例啟動(dòng)時(shí),需要指定pfile/spfile參數(shù),對(duì)應(yīng)的就是init文件和spfile文件。那么當(dāng)這兩個(gè)文件同時(shí)存在時(shí)Oracle如何決定讀取那個(gè)呢?
以O(shè)racle 9i為例,由于默認(rèn)采用了spfile來(lái)啟動(dòng)實(shí)例,所以查找的順序是:
spfile<ORACLE_SID>.ora ---> spfile.ora ---> init<ORACLE_SID>.ora
即默認(rèn)加載和SID對(duì)應(yīng)的參數(shù)文件,如果找不到則采用默認(rèn)的參數(shù)文件,再找不到就用舊的init文件,如果還是找不到則實(shí)例無(wú)法啟動(dòng)。下面我們來(lái)看看這些文件的內(nèi)容(以O(shè)racle 10g為例)
A.spfile<ORACLE_SID>.ora:




























B.init<ORACLE_SID>.ora

我們看到spfile<ORACLE_SID>.ora文件的內(nèi)容就是我們創(chuàng)建數(shù)據(jù)庫(kù)時(shí)在DBCA中填寫(xiě)的參數(shù),而init<ORACLE_SID>.ora文件的內(nèi)容則指向了該spfile,所以不論如何都是從spfile來(lái)啟動(dòng)實(shí)例了。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。