oracle sid,instance_name,db_name,oracle_sid之間的關係

不一樣的天空w發表於2017-07-15

【一】對ORACLE_SID的理解

--------------------------------------------------------------------------------
中SID的作用類似於一個“開關變數”---引導 在例項啟動時如何去預設位置下讀取適當的引數檔案並載入,以正確啟動例項。

我們知道例項的啟動需要指定pfile/spfile(Oracle9i之前是使用pfile--即init檔案,從9i開始就預設使用spfile--即伺服器端引數檔案這兩個檔案的存放位置為:

A.pfile:名字為init<ORACLE_SID>.ora
B.spfile:名字為spfile<ORACLE_SID>.ora

我們看到init檔案和spfile檔案都帶有ORACLE_SID的標識,這就是SID的作用了:

【1】當我們要啟動一個例項時,我們首先透過:set ORACLE_SID = XXX 或者export ORACLE_SID = XXX 的方式告訴Oracle接下來要啟動的例項

【2】當我們執行startup nomount時,由於已經指定了SID,那麼Oracle知道了如何去預設的目錄下查詢該例項對應的引數檔案--就是靠SID去匹配每個init/spfile檔案

【3】當Oracle找到該檔案後(init/spfile),就會讀取該檔案的內容,將一系列引數用於分配記憶體空間,構建後臺程式等例項的啟動過程

【4】當這個例項成功啟動後,我們又可以重新執行 set ORACLE_SID = XXX 或 export ORACLE_SID = XXX 命令再次將“開關撥向”另一個SID,然後重複以上步驟

從上面的過程我們看到Oracle SID的作用是一個明顯的“開關變數”,它拔向那一邊,那麼Oracle就會去找和它對應的引數檔案來啟動例項。其次SID也起到程式隔離的作用--即SID會在例項的一系列後臺程式中得到體現,如ora_dbw0_paullin,ora_dbw0_boblin。透過SID來命名後臺程式。

也必須透過SID來和Oracle例項打交道,作業系統並不知道什麼INSTANCE_NAME,只知道ORACLE_SID,在Oracle內部由Oracle自己根據這個SID去識別不同的例項。所以ORACLE_SID更多的是“Oracle和外部作業系統溝通的一個視窗”。


【二】對INSTANCE_NAME的理解
--------------------------------------------------------------------------------
相比於ORACLE_SID這樣的“開關變數”,INSTANCE_NAME則是一個實實在在的引數。它是在init/pfile檔案中配置的(db_name)。用於標識 例項的名稱,其預設值就是ORACLE_SID。

INSTANCE_NAME就像一個人的名稱一樣,而SID則是這個人的身份證號碼。透過SID我們找到對應的init/spfile檔案,而init/spfile檔案中又透過instance_name這個引數告訴我們對應的例項叫什麼名字。這樣就把ORACLE_SID、引數檔案、INSTANCE_NAME聯絡起來了。

造成ORACLE_SID不同,但INSTANCE_NAME相同的原因通常是因為複製了原有的引數檔案,但忘記了修改其中的INSTANCE_NAME引數的值。不過在10G之後INSTANCE_NAME這個引數以及從init/spfile中消失了,以免引起混亂。


【三】對DB_NAME的理解
--------------------------------------------------------------------------------
我們已經知道了ORACLE_SID是一個“開關變數”,INSTANCE_NAME是用來描述例項的。那麼DB_NAME則是描述例項掛載的資料庫名稱,透過這個DB_NAME我們可以知道對應的磁碟上的控制檔案、日誌檔案、資料檔案的位置。

DB_NAME在建立資料庫時被指定,預設情況下和ORACLE_SID的名字一樣。但和INSTANCE_NAME一樣。DB_NAME一旦被確定下來就不能修改了,因為它會同時儲存在init/spfie,控制檔案,日誌檔案,資料檔案。你只能修改init/spfile檔案中DB_NAME引數的值,但是不能手工修改其它檔案的值。所以一旦修改後引起幾個檔案的值不匹配那麼資料庫的啟動就會失敗。

A.一個例項可以MOUNT並開啟任何資料庫(透過init/spfile中配置DB_NAME引數),但是同一時間一個例項只能開啟一個資料庫。
B.一個資料庫可以被一個或多個例項所MOUNT並開啟(只能是在RAC環境下,普通環境下一個資料庫只能同時被一個例項MOUNT並開啟)。

那麼如何知道例項應該掛載到那個資料庫並開啟呢?就是靠init/spfile中的“control_files”引數來告訴Oracle去那裡讀取控制檔案,而控制檔案中又記錄了資料檔案的位置。所以最終形成一個完整的鏈條:

ORACLE_SID --> init/spfile檔案 --> instance_name、db_name、control_files --> 例項名、資料庫名、控制檔案 --> 資料檔案 --> 完成掛載並開啟


【四】ORACLE_SID、INSTANCE_NAME、DB_NAME對應關係
--------------------------------------------------------------------------------
我們已經知道ORACLE_SID是用來隔離同一個ORACLE_HOME下不同的例項的。但對於不同的ORACLE_HOME呢?能否有相同名稱的SID呢?

實際上這就和檔案系統的規則是一樣的:在同一個目錄下不允許有同名的檔案存在,但不同的目錄下可以有同名的檔案。同樣的在同一個ORACLE_HOME下不能有相同的SID存在,而不同的ORACLE_HOME下可以有重名的SID(即便是同一臺機,只要ORACLE_HOME不同就可以)。

那麼對於INSTANCE_NAME呢?預設情況下INSTANCE_NAME和ORACLE_SID是相同的,也可以是不同的;而且不同的例項可以具有相同的例項名。這聽起來有點混亂是不?其實我們可以用一個簡單的生活化例子來解析:

在一個班級Class_1裡面,有兩個學生,他們的名稱都叫張三,但他們的學號肯定不同。在這裡“張三”就是INSTANCE_NAME,而學號就是SID。所以INSTANCE_NAME重複沒關係,只要SID不同就可以區分開來。

但是在另外一個班級Class_2裡面,也有學號相同的學生,這時候就出現了我們說的SID相同的問題,那麼如何區分呢?別忘了我們還有班級這個概念啊!對應於ORACLE就是ORACLE_HOME了。

至於INSTANCE_NAME和DB_NAME的對應關係,這個很好理解了,不同的例項可以掛載到不同的DB,也可以掛載到相同的DB嘛。可以把這理解為“多個程式同時對同一份磁碟檔案的競爭性訪問”。

A. 相同ORACLE_HOME下,INSTANCE_NAME可以相同,但ORACLE_SID必須唯一。透過ORACLE_SID來區分不同的例項
B. 不同ORACLE_HOME下,ORACLE_SID可以相同,透過ORACLE_HOME來區分不同的SID
C.不同INSTANCE_NAME可以對應不同的DB_NAME,也可以對應相同的DB_NAME。但是如果不是在RAC環境下,只能同時啟動例項而不能同時掛載

 
【五】Oracle例項啟動過程的相關引數檔案
--------------------------------------------------------------------------------
前面說到Oracle例項啟動時,需要指定pfile/spfile引數,對應的就是init檔案和spfile檔案。那麼當這兩個檔案同時存在時Oracle如何決定讀取那個呢?

以Oracle 9i為例,由於預設採用了spfile來啟動例項,所以查詢的順序是:

spfile<ORACLE_SID>.ora ---> spfile.ora ---> init<ORACLE_SID>.ora

即預設載入和SID對應的引數檔案,如果找不到則採用預設的引數檔案,再找不到就用舊的init檔案,如果還是找不到則例項無法啟動。


==================================================

DB_NAME:

①是資料庫名,長度不能超過8個字元,記錄在datafile、redolog和control file中

②在DataGuard環境中DB_NAME相同而DB_UNIQUE_NAME不同

③在RAC環境中,各個節點的DB_NAME 都相同,但是INSTANCE_NAME不同

④DB_NAME還在 動態註冊監聽 的時候起作用,無論是否定義了SERVICE_NAME,PMON程式都會使用DB_NAME動態註冊監聽

 

DBID:

①DBID可以看做是DB_NAME在資料庫內部的表示,它是在資料庫建立的時候用DB_NAME結合演算法計算出來的

②它存在於datafile和control file中,用來表示資料檔案的歸屬,所以 DBID是唯一 的,對於不同的資料庫,DB_NAME可以是相同的,但是DBID一定是唯一的,例如在DataGuard中,主備庫的DB_NAME相同,但是DBID一定不同(看過一個很形象的例子,就是可以有同名的人,但是身份證號碼一定不同)

 

DB_UNIQUE_NAME:
①在DataGuard中,主備庫擁有相同的DB_NAME,為了區別,就必須有不同的DB_UNIQUE_NAME

②DB_UNIQUE_NAME在DG中會 影響動態註冊的SERVICE_NAME ,即如果採用的是動態註冊,則註冊的SERVICE_NAME為DB_UNIQUE_NAME,但是例項還是INSTANCE_NAME,即SID

 

INSTANCE_NAME:

①資料庫例項的名稱, INSTANCE_NAME預設值是SID ,一般情況下和資料庫名稱(DB_NAME)相同,也可不同

②initSID.ora 和orapwSID 檔案要與INSTANCE_NAME保持一致

③INSTANCE_NAME會影響程式的名稱

 

SID:

①是作業系統中的環境變數,和ORACLE_HOME,ORACLE_BASE用法相同

②在作業系統中要想得到例項名,就必須使用ORACLE_SID。且ORACLE_SID必須與INSTANCE_NAME的值一致

 

SERVICE_NAME:

①資料庫和客戶端相連是使用的服務名

②在DataGuard中,如果採用動態註冊,建議在主備庫使用相同的service_names

③在DataGuard中,如果採用靜態註冊,建議在主備庫上的listener中輸入相同的服務名(service_name)

④如果採監聽採用了靜態註冊,那麼SERVICE_NAME就等於Listener.ora 檔案中的GLOBAL_DATABASE_NAME的值

 

GLOBAL_DATABASE_NAME:

①GLOBAL_DATABASE_NAME 是listener配置的對外網路連線名稱,可以是任意值

②在客戶端配置監聽的tnsnames.ora 檔案中的service_name 與這個GLOBAL_DBNAME 保持一致就可以了

③配置 靜態監聽註冊 時,需要輸入SID和GLOBAL_NAME


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2142087/,如需轉載,請註明出處,否則將追究法律責任。

相關文章