ORACL中的DB_NAME,SERVICE_NAME,INSTANCE_NAME,ORACLE_SID,GLOBAL_DBNAME介紹

wolfreturn發表於2015-04-30
 Oracle記憶體在很多特殊意義的名字或者變數:ORACLE_SID,DB_NAME,INSTANCE_NAME,SERVICE_NAME,GLOBAL_DBNAME.

1.ORACLE_SID:(ORACLE SYSTEM IDENTIFIER)站點標示符

以環境變數的形式出現的。
Oracle例項是由SGA和一組後臺程式組成的,例項的建立和啟動需要一個引數檔案,而參 數檔案的名稱就是由ORACLE_SID決定的。對於init檔案,預設的檔名稱是init.ora,對於 spfile檔案,預設的檔名稱是spfile.ora
設定不同的ORACLE_SID值,就可以預設使用不同的引數檔案啟動不同的資料庫例項。
另外,ORACLE_SID的作用遠遠不是作為一個例項入口這麼簡單的,在例項啟動後,例項名稱INSTANCE_NAME也是從ORACLE_SID得到的。
2.INSTANCE_NAME:

    例項名稱,這是Oracle例項的名字,用來區分不同的例項。在Oracle9i之前,該名字儲存在兩個地方:引數檔案和資料庫的內部檢視(V$INSTANCE).
而在Oracle10g之後的版本中,該名字不再出現在引數檔案中,而是動態從系統中獲得,預設是取自ORACLE_SID。
 INSTANCE_NAME的作用除了區別不同例項之外,在監聽器動態註冊時,還會用於向監聽器註冊。比如instance_name=wolf,監聽中將動態註冊Instance "wolf",status READY資訊。
3.DB_NAME:

    DB_NAME概念相比於INSTANCE_NAME要重要的多,它決定例項將掛在的資料檔案。它出現在資料檔案,控制檔案,日誌檔案中。在引數檔案中也出現,且必須出現。這個引數涉及到系統的物理檔案。
4.SERVICE_NAME和GLOBAL_DBNAME:
    這兩個引數之所以放在一起講,是因為他們往往是成對出現的。SERVICE_NAME出現在Tnsnames.ora檔案中,是客戶端要請求的服務名。
GLOBAL_DBNAME 出現在Listener.ora檔案中,是伺服器提供的服務名,可以透過show paramerer service_names檢視,並可以透過alter system set service_name='servicename' scope=both來修改。
SERVICE_NAMES為例項所連線的資料庫定義一個或多個服務名,可以透過定義多個服務名將不同使用者連線區分開來。這個引數的預設格式為:DB_NAME.DB_DOMAIN,如果定義了DB_DOMAIN那麼定義的服務名就類似: 
SERVICE_NAMES = sales.eygle.com, news.eygle.com
透過這樣的定義,銷售使用者可以透過在客戶端TNSNAME定義中使用SALES服務名來建
立連線,而新聞使用者則可以透過NEWS服務名進行連線,終端使用者可以不必關注資料庫是哪
一個,他們只需要關心服務名。



二者對應,實現了Listerner.ora/Tnsnames.ora的重要功能----監聽、請求與驗證。

總結:一條startup命令,究竟是如何啟動龐大的oracle資料庫的呢?下面我們來貫穿起來整個啟動流程,一探究竟:
首先,系統接收到startup命令,立刻採取行動,取得環境變數ORACLE_SID的值,啟動第一階段--例項建立。系統根據找到的引數檔案啟動 ORACLE資料庫例項,例項啟動後,一切由例項接管:註冊INSTANCE_NAME,往往INSTANCE_NAME就是來自ORACLE_SID, 接著向監聽器動態註冊例項自己,並將INSTANCE_NAME寫入系統資料字典表,
接下來,例項進一步讀取引數檔案,取得DB_NAME、控制檔案、檢查點等資訊,進入第二階段--掛載資料庫。例項從控制檔案中取得DB_NAME,並取 得資料檔案、日誌檔案等資訊,進行DB_NAME的一致性檢驗、檔案的存在性判斷等工作之後,例項將掛載資料庫,掛載的資料庫就是DB_NAME指定的數 據庫。
最後,例項進入第三階段--啟動資料庫。這一階段,例項進行了兩項檢查:檢查點和更改點檢查,之後啟動資料庫。

init.ora 中的instance_name是可以設定的,這個大家都知道是沒有錯誤的,但是這個和我們ORACLE_SID又有什麼區別呢?其實還是有一些區別 的,ORACLE_SID就是系統表示符,這個環境變數就是要告訴OS,我要讀取那個init.ora檔案或者spfile來啟動我的Oracle instance,比如set ORACLE_SID=mylife,這個時候當我連入Oracle後,執行startup,那麼Oracle就會尋找spfilemylife.ora 或者initmylife.ora這樣的引數檔案,並啟動我的instance,在資料庫成 功open後,我們可以透過select instance_name from v$instance來觀察這個已經記錄的SID,這個時候我們也可以show parameter instance_name來觀察這個值,沒錯都是mylife,一般來講,我們啟動instance所載入的pfile或者spfile中也記錄了一個 instance_name這個引數,但是這個引數一般沒有顯示的列出,因此我們可以手動的去加上這個引數或者修改這個引數,把這個引數的值改為和 mylife不相同的一個值mylove,這個時候再重新啟動資料庫,會發現show parameter和select instance_name from v$instance的方式有兩個不同的值分別是mylove和mylife,如果我們的tnsnames.ora中的檔案是以sid方式來尋找服務,那 麼這個sid 的值就不是mylife了,而要改為mylove.恩,大體上就是這個意思。還沒有深入研究太多,對於大多數使用者來講,理解這些就足夠了。
再 說一下service_name,如果我們的引數檔案中記錄了db_domain比如是cn.ibm.com,那麼service_name預設就是 db_name+db_domain,但是我們完全可以修改這個值,原先資料庫的service_name=icmnlsdb.cn.ibm.com,現 在比如我在pfile中顯示的指定service_names=abc,重啟database後,這個service_name就變為了abc,而不是先 前的icmnlsdb.cn.ibm.com了,那麼在tnsnames.ora中的service_name列,我就要指定這個值為 abc+db_domain.注意不是service_name+db_domain,因為我的service_name在修改後是不帶domain標識 的,那麼如果db_domain為空的話,tnsnames.ora檔案中的service_name就直接可以寫為abc了。大體就是這個意思,解釋的 有點饒,但是總算可以從這條路中走出來了。
最後一點,lsnrctl status我們隨時觀察一下listener的狀態,看看他到底有什麼變化。很有意思的。


在init.ora中有db_name,instance_name,service_name
在作業系統中需要配置oracle_sid
在listener.ora中有SID_NAME,GLOBAL_DBNAME,
在tnsname.ora中有SERVICE_NAME,SID
這麼多,是不是你也看糊塗了。先暈一個,下面慢慢道來。

在init.ora中有db_name,instance_name,service_name
db_name是資料庫的名稱,在db安裝時就已經設定了,這裡不可修改,它覺得了資料庫安裝檔案的位置。
instance_name是例項名,是資料庫執行中名稱,其實在OO中db_name相當於類而instance_name向當於物件,它也 是代表資料庫執行中的記憶體及其程式,同時影響到了這些程式的名稱,譬如:一個資料庫db_name=cus,而其例項instance_name= aking,那麼資料庫起來後,其程式名可能為:Pmon_aking_1。這裡的例項名稱要和PWDsid.ora和initSid.ora等檔案匹配 上,否則,db起動報錯。從這裡可以看出db_name是類名,定義後是不可修改的,而對於instance_name例項名向當於物件,所以我們可以設 定自己喜歡的物件名稱。不過話雖這樣講,但改了instance_name後,牽扯到很多其他的設定,還是最好不要動他,預設和db_name是一樣的, 這樣多好。
service_name我覺得應該是指資料庫網路連線時的名稱,在listener配置中會有所考慮的。這個值也是可以隨意改動的,並且還可以有多個值。alter system set service_name=serv1,serv2 scope=both;

在listener.ora中有SID_NAME,GLOBAL_DBNAME
這裡SID_NAME指資料庫的執行的例項名,應該是和instance_name一致
而對於GLOBAL_DBNAME是listener配置的對外網路連線名稱,我們在配置tnsname.ora時會考慮這個引數。這個引數可以任意的設定。
另外有一點需要注意,一般我們會在listener.ora手工配置資料庫例項的監聽配置。但oracle可以透過pmon程式支援自動註冊, 這時自動註冊的對外網路連線名稱就會用到init.ora檔案中service_name,有多個值的話就會註冊多個,對於上面的例子,在這裡就會註冊 serv1和serv2兩個監聽服務。如果你還手工配置了一個GLOBAL_DBNAME=serv3的監聽服務的話,那麼對於例項 instance_name=aking就會有三個監聽服務。

在tnsname.ora中有SERVICE_NAME,SID
下面配置客戶端的tnsname.ora
對於這裡的配置主要要給出要連線的資料庫的IP及其連線的例項或服務
在監聽配置中我們提到了對外網路連線名稱,在這裡如果我們用SERVICE_NAME的話,就需要SERVICE_NAME= (GLOBAL_DBNAME或者service_name這裡要求oracle已經自動註冊到了監聽器中),對於SID= (instance_name)即可,譬如:
SERVICE_NAME=serv1,serv2,serv3都可以,或者
SID=aking

最後一個是ORACLE_SID引數,這個引數是作業系統中用到的,它是描述我們要預設連線的資料庫例項,對於一個機器上有多個例項的情況下,要修改後才能透過 conn / as sysdba連線,因為這裡用到了預設的例項名。

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

相關文章