Oracle中ORACLE_SID,INSTANCE_NAME,DB_NAME幾個名詞的區別

同事項目用到 Oracle,向我問起這些內容,雖本人忝列 OCP,但那是6年前的事了,這幾年工做繁重,基本作了清零,受同事之託從新梳理了一遍。linux


涉及到的名字包括如:DB_NAME,DB_DOMAIN,ORACLE_SID,INSTANCE_NAME, SERVICE_NAME 等。算法


提起這些名字,首先要理解 ORACLE 的邏輯架構,咱們一般說的能夠訪問的ORACLE DB。其實兩部分組成:實例(包括一組進程,和SGA內存等) + 物理介質。介質包括控制文件,數據文件,日誌文件,參數文件等。實例進程就是一堆操做物理介質的進程。再者實例進程能夠不掛載(mount)任何物理介質,這時的實例叫 idle instance.sql


上面的名字先找簡單的說:DB_NAME。這兩個東西建立數據庫時指定,並且最具穩定性,DB_NAME遍及在數據文件,日誌文件,參數文件中,99.9%狀況下不會也不須要去變他。(雖然如今版本也能夠修改了)。數據庫


能夠把他理解成物理介質的標記,這些物理介質都屬這個DB。至於DB_DOMAIN只是爲好分佈式管理加的一個標識而已,意義不大,知道有這個東西便可。架構


ORACLE_SID:通常ORACLE_SID做環境變量用,他是個操做系統層面的東西, 最多見的兩個用處:oracle

決定Oracle實例 進程的名字,在linux下看,Oracle相應的進程,會發現都綴有ORACLE_SID。app

定位Oracle的啓動參數文件,Oracle在啓動時要尋找其配置文件(目前以這個順序查找spfile<ORACLE_SID>.ora -> spfile.ora -> init<ORACLE_SID>.ora)。分佈式

Oracle啓動以後,這個參數也沒多大用處了。ide

注: 相同Oracle_HOME下,ORACLE_SID要不一樣,不一樣Oracle_HOME下,可相同。操作系統


INSTANCE_NAME:DB_NAME是物理介質的標識,INSTANCE_NAME就是實例進程的標識。

對ORACLE數據庫,非RAC狀況下,物理介質能夠被任意實例進程掛載(mount)和打開(open)

但同一時間,只能有一個實例進程打開他。 RAC狀況下,則容許多個實例進程打開相同的物理介質。

1+1變成了n+1,也就是說RAC狀況下,多個實例對應着同一個物理介質。


JAVAEE同窗都記得JDBC的鏈接串爲:jdbc:oracle:thin:@<host>:<port>:<SID> 

這個SID就是INSTANCE_NAME。數據庫鏈接,實際上是鏈接到實例進程。大多數時候咱們都當成了ORACLE_SID, 只是由於那個時候他們相同了。(關於各個參數的default值問題,這裏不說子,碼字累)。


彷佛有INSTANCE_NAME+DB_NAME已經完美的解決的實體的定位問題。直到RAC的出現,打破了這一寧靜。出了多個實例同時打開同一個DB_NAME的狀況。那個上面的JDBC的鏈接串就很差用了,這時SERVICE_NAME橫空出世。

簡單的說,SERVICE_NAME表明整個數據庫(進程+DB),一個SERVICE_NAME下面能夠有多個實例,因此不管是RAC,仍是單例數據庫, jdbc:oracle:thin:@<host>:<port>:<SERVICE_NAME>均可以正常鏈接。 


SERVICE_NAME怎麼發揮作的呢,咱們知道Oracle監聽在1521端口,由於存在一個監聽器。在ORACLE實例啓動時,PMON進程會將該實例註冊到這個監聽器上,當前也所括其所屬性的服務名,這種叫動態註冊,可能不易理解SERVICE_NAME(能夠用lsnrctl status命令查看存在的service及instance),看一個靜態註冊的listener.ora:

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
   (SID_NAME = ORCL) ---這裏爲INSTANCE_NAME
   (ORACLE_HOME = /mydatafile2/app/oracle/oracle/product/11.2.0/db_1)
   (GLOBAL_DBNAME=WOO.COM) ---這裏爲SERVICE_NAME。
  )
)

鏈接到這個SERVICE,監聽器就會按必定算法將鏈接負載到相應的實例上。

綜上看:訪問數據庫關注的大多爲Instance_name和service_name.  

 而管理數據庫用到ORACLE_SID和DB_NAME

先寫這麼多吧,後面再補。

相關文章
相關標籤/搜索