1. 程式人生 > >ORACLE中的db_name,service_names,instance_name,oracle_sid,global_dbname

ORACLE中的db_name,service_names,instance_name,oracle_sid,global_dbname

oracle oracle_sid dbname instance_name

Oracle中有很多與名字相關的參數,有時會讓人覺得迷惑,這個參數都有什麽作用,它們之間的區別又是什麽呢?

下面我們先來看一看都有哪些參數與名字相關

  • 參數文件中有db_name,instance_name,service_names,db_unique_name

  • 環境變量中有oracle_sid

  • 在listener.ora中有sid_name,global_dbname(靜態註冊的情況下)

  • 在tnsnames.ora中有service_name,sid

它們各有什麽含義呢,我們來一一介紹:

db_name:

對一個數據庫(Oracle database)的唯一標識,這種表示對於單個數據庫時足夠的,但是對於分布

式數據庫,可能存在各個數據庫的名字可能一樣,db_domian也就是為了解決這一問題,這樣數據庫的 標識是由db_name和db_domain兩個參數共同決定。類似於互聯網上的機器名管理,用db_name.db_domain來表示一個數據庫,並將該數據庫的名稱稱為global_name。db_name只能由字母/數字,‘_‘,‘#‘,‘$‘組成,而且最多8個字符。

技術分享

DB_UNIQUE_NAME:

和db_name不一樣的作用,用於指定數據庫的全局唯一名,比如DG中的物理備庫與主庫有相同的db_name和db_domain。需要用db_unique_name來進行區別。可以設置30個字符,大小寫不敏感,由字母/數字,‘_‘,‘#‘,‘$‘組成。DB_UNQUIE_NAME的會影響到Service_names,也會影響到動態監聽的時候的service_name。

instance_name:

實例唯一標識符,如RAC環境,存在多實例情況下,用instance_name區別每個實例。用來設置在動態監聽中註冊的instance_name,對應的如果在tnsnames.ora中使用SID連接時,需要與之做對應。

未修改instance參數前,如下圖所示

技術分享修改instance_name參數後:

技術分享兩張圖對比可以知道,instance_name在註冊監聽時起到指定名字的作用。

此外一些包含instance_name或inst_name列的動態性能視圖是從環境變量ORACLE_SID(而不是這個參數)來推斷的。

service_names:

用於設置在監聽中註冊的服務名。對應的做tnsnames.ora中如果使用SERVICE_NAME連接時需要與之對應。

修改service_names之前,service_names與監聽中的service一致:

技術分享修改service_names後,監聽中多出了設置的service名:

技術分享使用新設置的服務名也可以連接到數據庫:

技術分享

oracle_sid:

實例標識符,以環境變量形式存在,同時用於對應共享內存段.Oracle實例是由SGA和一組後臺進程組成的,實例的創建和啟動需要一個參數文件,而參數文件的名稱就是由ORACLE_SID決定的。對於init文件,缺省的文件名稱是init<ORACLE_SID>.ora,對於spfile文件,缺省的文件名稱是spfile<ORACLE_SID>.ora。設置不同的ORACLE_SID值,就可以默認使用不同的參數文件啟動不同的數據庫實例。

也就是說ORACLE_SID決定本地啟動的數據庫實例的實例名,只要有對應的init<ORACLE_SID>.ora或spfile<ORACLE_SID>.ora就可以啟動,也可以在startup中指定pfile啟動都是可以的,只要參數文件中設置的其他參數可以啟動一個數據庫就行。

正常情況下ORACLE_SID=test,啟動數據庫如下圖,生成的進程以test標識。

技術分享關閉數據庫,修改ORACLE_SID=mydb,同樣可以啟動數據庫,不過需要手動指定參數文件,生成的進程以mydb標識。

技術分享即使進程都是與mydb相關,但數據庫名字和監聽的配置仍然為test

技術分享

對應動態性能視圖裏的instance_name和inst_name也發生了變化:

技術分享

tnsnames.ora中的service_name和sid:

tnsnames.ora中的service_name和sid分別要連接的遠程數據庫在監聽中註冊的service和instance相對應。

test =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.2)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = test)
    )
  )
  
test =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.2)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = test)
    )
  )

listener.ora中的sid_name和global_dbname:

這兩個參數用於使用靜態註冊監聽時識別為哪個實例靜態註冊。

SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME=orcl)
      (ORACLE_HOME=/u02/app/oracle/product/11.2.4/db1)
      (SID_NAME=orcl)))

以上內容為我自己的整理與總結,有不對的地方還請大神指點。


參考:http://blog.sina.com.cn/s/blog_616b428f0100iwro.html


本文出自 “DBA Fighting!” 博客,請務必保留此出處http://hbxztc.blog.51cto.com/1587495/1923899

ORACLE中的db_name,service_names,instance_name,oracle_sid,global_dbname