天天看點

Oracle資料庫名與Oracle執行個體名的關系1 資料庫名2 資料庫執行個體名(instance name)3 ORACLE_SID(環境變量)4 資料庫域名與全局資料庫名5 資料庫服務名(service_name)6 網絡服務名(net_service_name)

1 資料庫名

1.1 資料庫名的概念

資料庫名(db_name)就是一個資料庫的辨別,就像人的身份證号一樣。如果一台機器上裝了多個資料庫,那麼每一個資料庫都有一個資料庫名。在資料庫安裝或建立完成之後,參數DB_NAME被寫入參數檔案之中。

資料庫名在$ORACLE_HOME/admin/db_name/pfile/init.ora(或$ORACLE_BASE/admin/db_name/pfile/init.ora或$ORACLE_HOME/dbs/SPFILE<執行個體名>.ORA)檔案中

###########################################

# Database Identification

###########################################

db_domain=""

db_name=orcl

在建立資料庫時就應考慮好資料庫名,并且在建立完資料庫之後,資料庫名不宜修改,即使要修改也會很麻煩。因為,資料庫名還被寫入控制檔案中,控制檔案是以二進制型式存儲的,使用者無法修改控制檔案的内容。假設使用者修改了參數檔案中的資料庫名,即修改DB_NAME的值。但是在Oracle啟動時,由于參數文 件中的DB_NAME與控制檔案中的資料庫名不一緻,導緻資料庫啟動失敗,将傳回ORA-01103錯誤。

1.2 資料庫名的作用

資料庫名是在安裝資料庫、建立新的資料庫、建立資料庫控制檔案、修改資料結構、備份與恢複資料庫時都需要使用到的(注意這些時候不能使用sid,還有alter database時都是使用資料庫名)。

有很多Oracle安裝檔案目錄是與資料庫名相關的,如:

     winnt: F:\oracle\product\10.2.0\oradata\DB_NAME\...

又如參數檔案pfile:

     winnt: F:\oracle\product\10.2.0\admin\DB_NAME\pfile\init.ora.54200885729

如果控制檔案損壞或丢失,資料庫将不能加載,這時要重新建立控制檔案,方法是以nomount方式啟動執行個體,然後以create controlfile指令建立控制檔案,當然這個指令中也要指明DB_NAME。

1.3 修改資料庫名

建議:應在建立資料庫時就确定好資料庫名,資料庫名不應作修改,因為修改資料庫名是一件比較複雜的事情。是區分資料的内部辨別(即是給Oracle資料庫内部使用的),因為其在資料庫多處儲存,并且控制檔案中儲存的是二進制的,是以很難改變其名字。

在已建立資料之後,修改資料庫名。步驟如下:

(1)關閉資料庫。

(2)修改資料庫參數檔案中的DB_NAME參數的值為新的資料庫名。

(3)以NOMOUNT方式啟動執行個體,修建控制檔案(有關建立控制檔案的指令文法,請參考oracle文檔)

1.4 查詢目前資料庫名

方法一:select name from v$database;

方法二:show parameter db

方法三:檢視參數檔案,$ORACLE_HOME/admin/db_name/pfile/init.ora(或$ORACLE_BASE/admin/db_name/pfile/init.ora)

2 資料庫執行個體名(instance name)

2.1 資料庫執行個體名的概念(instance_name)

執行個體名是代表用于加載或打開一個資料庫所用的memory structures + Background process (MEM + BGP)。在unix中,執行個體名由ORACLE_SID環境變量定義,在windows中由服務名定義。可以用于連接配接字元串中,這種用法用于8i版本前,雖然10g仍然支援,但是并不推薦,因為這種方法缺乏對某些新特性的支援。

執行個體是通路Oracle資料庫所需的一部分計算機記憶體和輔助處理背景程序,是由程序和這些程序所使用的記憶體(SGA)所構成一個集合,它根本不需要一個與其相關聯的資料庫,沒有任何資料檔案也可以啟動執行個體。下面是Oralce的啟動過程:

   sqlplus / as sysdba

   sql>startup nomount  #啟動了一個執行個體,現在SGA配置設定了,程序在運作,除資料庫外所有的東西都啟動了

   sql>alter database mount  #利用控制檔案(init.ora檔案中指定)定位重作日志檔案、資料檔案、臨時檔案

   sql>alter database open  #資料庫可供任何人通過這個執行個體通路。

是以可以這麼了解:通路Oracle都是通路一個執行個體,但這個執行個體如果關聯了資料庫檔案,就是可以通路的,如果沒有,就會得到執行個體不可用的錯誤。

執行個體名指的是 用于響應某個資料庫操作的資料庫管理系統的名稱,也叫SID。執行個體名是由參數instance_name決定的。如果這個參數不被指定(即instance_name沒有被指定為任何值),那麼執行個體的名字由該使用者的 環境變量ORACLE_SID(注意這裡是大寫)決定。在windows平台下,則是 系統資料庫中oracle_sid值決定。

執行個體名和SID是一一對應的,名字相同,但存儲位置不同。

2.2 執行個體和資料庫   

執行個體和資料庫之間的差別如下:

(1)執行個體是臨時的,它隻在相關的程序和記憶體集合存在時存在;資料庫是永久的,隻要檔案存在它就存在。

(2)一個執行個體在其生存期内可安裝和打開 單個資料庫;資料庫可以被 很多執行個體安裝和打開,或者一個接一個的執行個體安裝和打開,或者由多個執行個體同時安裝和打開(RAC)。

簡單來說RAC就是多個執行個體同時打開一個資料庫檔案的系統,在結構上是多台機器,每台機器運作一個執行個體,每個執行個體都打開同一個資料庫 (這個是用磁盤共享技術實作的),這些執行個體之間需要同步高速緩存,這樣保證多個執行個體是完全一緻的,不會互相沖突乃至覆寫。

資料庫執行個體名(instance_name)用于對外部連接配接。在作業系統中要取得與資料庫的聯系,必須使用資料庫執行個體名。例如,要去連接配接一個資料庫伺服器,就必須知道其資料庫執行個體名,隻知道資料庫名是沒有用的。與資料庫名不同,在資料安裝或建立資料庫之後,執行個體名可以被修改。資料庫名和執行個體名可以相同也可以不同。在一般情況下,資料庫名和執行個體名是一對一的關系,但如果在oracle并行伺服器架構(即oracle實時應用叢集) 中,資料庫名和執行個體名是一對多的關系(一個資料庫對應多個執行個體,同一時間内使用者隻與一個執行個體相聯系,當某一執行個體出現故障,其它執行個體自動服務,以保證資料庫安全運作) 。

執行個體就是一組作業系統程序(或者是一個多線程的程序)以及一些記憶體,這些程序可以操作資料庫;而資料庫隻是一個檔案集合(包括資料檔案、臨時檔案、重做日志檔案和控制檔案)。在任何時刻,一個執行個體隻能有一組相關的檔案(與一個資料庫關聯)。大多數情況下,反過來也成立:一個資料庫上隻有一個執行個體對其進行操作。不過,Oracle的應用叢集(Real Application Clusters,RAC)是一個例外,這是Oracle提供的一個選項,允許在叢集環境中的多台計算機上操作,這樣就可以有多台執行個體同時裝載并打開一個資料庫(位于一組共享實體磁盤上)。由此,我們可以同時從多台不同的計算機通路這個資料庫。Oracle RAC能支援高度可用的系統,可用于建構可擴縮性極好的解決方案。

2.3 查詢目前資料庫執行個體名

方法一:select instance_name from v$instance;

方法二:show parameter instance

3 ORACLE_SID(環境變量)

在實際中,對于資料庫執行個體的辨別有時使用執行個體名,有時使用ORACLE_SID,它們有什麼差別呢?(非常容易混淆)

OS(ORACLE_SID)<----------------> ORACLE 資料庫 <--------(instance_name(執行個體名))

上圖表示執行個體名instance_name、ORACLE_SID與資料庫及作業系統之間的關系,雖然這裡列出的兩個參數都是資料庫執行個體名,但 instance_name參數是ORACLE資料庫的參數,此參數可以在參數檔案中查詢到;而ORACLE_SID參數則是作業系統環境變量,與 ORACLE_BASE、ORACLE_HOME等用法相同,用于和作業系統互動。也就是說,在作業系統中要想得到執行個體名,就必須使用ORACLE_SID。且ORACLE_SID必須與instance_name的值一緻,否則,你将會收到一個錯誤,在winnt平台,是“TNS:協定擴充卡錯誤”。

在資料庫安裝之後,ORACLE_SID被用于定義資料庫參數檔案的名稱。如: 

$ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora。

如果在同一伺服器中建立了多個資料庫,則必然同時存在多個資料庫執行個體,這時可以重複定義過程(export ORACLE_SID=orcl),以選擇不同執行個體。 還可以用oraenv指令行來切換不同的ORACLE_SID來通過作業系統來啟動不同的執行個體(instance)

4 資料庫域名與全局資料庫名

4.1 概念與聯系  

使用資料庫名(da_name)對一個資料庫進行唯一辨別,這種表示對于單個資料庫是足夠的,但是随着由多個資料庫構成的分布式資料庫的普及,這給資料庫的管理造成一定的負擔,因為各個資料庫的名字可能一樣,造成管理上的混亂。為了解決這種情況,引入了db_domain參數,這樣資料庫的辨別是由db_name和db_domain兩個參數共同決定的,避免了因為資料庫重名而造成管理上的混亂。這類似于互連網上的機器名的管理。我們 将db_name和db_domain兩個參數用‘.’連接配接起來,表示一個資料庫,并将該資料庫的名稱稱為global_name,即它擴充了 db_name。db_name參數隻能由字母、數字、’_’、’#’、’$’組成,而且最多8個字元。

資料庫域名(db_domain):定義一個資料庫所在的域,該域的命名同網際網路的“域”沒有任何關系,隻是資料庫管理者為了更好的管理分布式資料庫而根據實際情況決定的。當然為了管理友善,可以将其看作網際網路的域。

全局資料庫名(global_name):對一個資料庫(Oracle database)的唯一辨別,oracle建議用此種方法辨別資料庫。該值是在建立資料庫時決定的,預設值為db_name. db_domain。在以後對參數檔案中db_name與db_domain參數的任何修改不影響global_name的值,如果要修改 Global_name,隻能用alter database rename global_name to <db_name.db_domain>指令進行修改,然後修改相應參數。

4.2查詢資料庫域名

方法一:select value from v$parameter where name = 'db_domain';(10g中不可行)

方法二:show parameter domain

方法三:在參數檔案中查詢,$ORACLE_HOME/admin/db_name/pfile/init.ora(或$ORACLE_BASE/admin/db_name/pfile/init.ora)

4.3 例子

全國交通GIS系統的分布式資料庫,其中:

吉林節點: jl.jtgis

吉林長春節點: cc.jl.jtgis

河北節點: hb.jtgis

河北石家莊節點:sjz.hb.jtgis

這些就是資料庫域名,資料庫域名在存在于參數檔案中,她的參數是db_domain.

全局資料庫名=資料庫名+資料庫域名,如前述福建節點的全局資料庫名是:orcl.jl.jtgis

5 資料庫服務名(service_name)

該參數是oracle8i新引進的。在8i以前,我們用SID來表示資料庫的一個執行個體,但是在Oracle的并行環境中,一個資料庫對應多個執行個體,這樣就需要多網絡服務名,設定繁瑣。為了友善并行環境中的設定,引進了service_name參數。 該參數對應一個資料庫,而不是一個執行個體,而且該參數有許多其它的好處。

該參數的預設值為db_name.db_domain,即等于global_name。如果資料庫有域名,則資料庫服務名就是全局資料庫名;否則,資料庫服務名與資料庫名相同。一個資料庫可以對應多個service_name,以便實作更靈活的配置。該參數與SID沒有直接關系,即 service_name 不必與SID一樣。

從Oracle8i開始的oracle網絡元件,資料庫與用戶端連接配接的主機字元串推薦使用的是資料庫服務名。之前用的是SID,即資料庫執行個體名。

SID = the unique name of your DB instance, ServiceName = the alias used when connecting。

如果database is registered with listener in this way,你就可以在tnsnames.ora檔案中使用SERVICE_NAME parameter,否則就要用SID。

查詢資料庫服務名(方法二測試可行)

     方法一:select value from v$parameter where name = 'service_name';(10g中不可行)

     方法二:show parameter service_name

更多關于服務名的資訊可以參考:

http://www.dbabeta.com/2009/service-name-registeration.html

http://space.itpub.net/?uid-67294-action-viewspace-itemid-402633

6 網絡服務名(net_service_name)

網絡服務名(net_service_name),又可以稱為資料庫别名(database alias),是用戶端程式通路資料庫時所需要,屏蔽了用戶端如何連接配接到伺服器端的細節,實作了資料庫的位置透明的特性。網絡服務名被記錄在 tnsnames.ora檔案中。

可以通過netmgr來建立網絡服務名。

網絡服務名是從用戶端的角度出發,當用戶端連接配接遠端資料庫或其他服務時,可以指定網絡服務名。是以需要使用一個或多個命名方法将此Net服務名解析為連接配接資料庫或其他服務的連接配接描述符,命名方法如下:

  [本地]——将存儲在本地客戶機的tnsnames.ora檔案中的網絡服務名解析為連接配接描述符。

  [Oracle Names]——由Oracle名字伺服器提供為網絡上的每個Oracle Net服務提供解析方法

  [主機名]——通過TCP/IP環境中的主機名稱連接配接到Oracle資料庫服務

  [Sun NIS]/[DCE CDS]——專用系統用的,在Windows 2000系統環境下不适用

參考資料:

[1]https://forums.oracle.com/forums/thread.jspa?threadID=538986

[2]http://stackoverflow.com/questions/43866/how-sid-is-different-from-service-name-in-oracle-tnsnames-ora

繼續閱讀