1. 程式人生 > >oracle例項名,資料庫名,服務名等概念區別與聯絡

oracle例項名,資料庫名,服務名等概念區別與聯絡

DB_NAME: 資料庫名,此引數在建立資料前決定,資料庫建立後修改時,必須建控制檔案

DB_DOMAIN: 資料庫域名,用於區別同名數據庫。資料庫名與域名一起構成了全域性資料庫名

INSTANCE_NAME: 資料庫例項名,可以與資料庫相同

SERVICE_NAMES: 資料庫服務名,與全域性資料庫名相同如果沒有域名,則服務名就是資料庫名

1、查詢資料庫名:

   ①selectname,dbid from v$database;

   ②showparameter db_name;

2、查詢例項名:

     ①select instance_name from v$instance;

     ②s showparameter instance_name;
3、查詢資料庫域名:

     ①select value from v$parameter where name='db_domain';  

     ②showparameter domain;
4、查詢資料庫伺服器:

     ①select value from v$parameter where name='service_name';

     ②showparameter service;

     ③showparameter names;
5、資料庫服務名:此引數是資料庫標識類引數,用service_name表示。資料庫如果有域,則資料庫服務名就是全域性資料庫名;如果沒有,則資料庫服務名就是資料庫名。

     ①show parameter service_name;

資料庫oracle伺服器archivedatabase多執行緒資料庫名、例項名、資料庫域名、全域性資料庫名、服務名這是幾個令很多初學者容易混淆的概念。相信很多初學者都與我一樣被標題上這些個概念搞得一頭霧水。我們現在就來把它們弄個明白。

一、資料庫名

什麼是資料庫名?

資料庫名就是一個數據庫的標識,就像人的身份證號一樣。他用引數DB_NAME表示,如果一臺機器上裝了多全資料庫,那麼每一個數據庫都有一個數據庫名。在資料庫安裝或建立完成之後,引數DB_NAME被寫入引數檔案之中。格式如下:

DB_NAME=myorcl

...

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

資料庫名的作用

資料庫名是在安裝資料庫、建立新的資料庫、建立資料庫控制檔案、修改資料結構、備份與恢復資料庫時都需要使用到的。

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

winnt:d:/oracle/product/10.1.0/oradata/DB_NAME/...

Unix:/home/app/oracle/product/10.1.0/oradata/DB_NAME/...

pfile:

winnt:d:/oracle/product/10.1.0/admin/DB_NAME/pfile/ini.ora

Unix:/home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora

跟蹤檔案目錄:

winnt:/home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/...

另外,在建立資料時,careatedatabase命令中的資料庫名也要與引數檔案中DB_NAME引數的值一致,否則將產生錯誤。

同樣,修改資料庫結構的語句alterdatabase,當然也要指出要修改的資料庫的名稱。

如果控制檔案損壞或丟失,資料庫將不能載入,這時要重新建立控制檔案,方法是以nomount方式啟動例項,然後以create controlfile命令建立控制檔案,當然這個命令中也是指指DB_NAME

還有在備份或恢復資料庫時,都需要用到資料庫名。

總之,資料庫名很重要,要準確理解它的作用。

查詢當前資料名

方法一:select namefrom v$database;

方法二:show parameterdb

方法三:檢視引數檔案。

修改資料庫名

前面建議:應在建立資料庫時就確定好資料庫名,資料庫名不應作修改,因為修改資料庫名是一件比較複雜的事情。那麼現在就來說明一下,如何在已建立資料之後,修改資料庫名。步驟如下:

1.關閉資料庫。

2.修改資料庫引數檔案中的DB_NAME引數的值為新的資料庫名。

3.NOMOUNT方式啟動例項,修建控制檔案(有關建立控制檔案的命令語法,請參考oracle文件)

二、資料庫例項名

什麼是資料庫例項名?

資料庫例項名是用於和作業系統進行聯絡的標識,就是說資料庫和作業系統之間的互動用的是資料庫例項名。例項名也被寫入引數檔案中,該引數為instance_name,在winnt平臺中,例項名同時也被寫入登錄檔。

資料庫名和例項名可以相同也可以不同。

在一般情況下,資料庫名和例項名是一對一的關係,但如果在oracle並行伺服器架構(oracle實時應用叢集)中,資料庫名和例項名是一對多的關係。這一點在第一篇中已有圖例說明。

查詢當前資料庫例項名

方法一:selectinstance_namefrom v$instance;

方法二:show parameterinstance

方法三:在引數檔案中查詢。

資料庫例項名與ORACLE_SID

雖然兩者都表是oracle例項,但兩者是有區別的instance_nameoracle資料庫引數。而ORACLE_SID是作業系統的環境變數。 ORACLD_SID用於與作業系統互動,也就是說,從作業系統的角度訪問例項名,必須通過ORACLE_SID。在winnt不臺, ORACLE_SID還需存在於登錄檔中。

ORACLE_SID必須與instance_name的值一致,否則,你將會收到一個錯誤,在unix平臺,是“ORACLE notavailable,winnt平臺,是“TNS:協議介面卡錯誤”。

資料庫例項名與網路連線

資料庫例項名除了與作業系統互動外,還用於網路連線的oracle伺服器標識。當你配置oracle主機連線串的時候,就需要指定例項名。當然8i以後版本的網路元件要求使用的是服務名SERVICE_NAME。這個概念接下來說明。

三、資料庫域名

什麼是資料庫域名?

在分佈工資料庫系統中,不同版本的資料庫伺服器之間,不論執行的作業系統是unix或是windows,各伺服器之間都可以通過資料庫鏈路進行遠端複製,資料庫域名主要用於oracle分散式環境中的複製。舉例說明如:

全國交通運政系統的分散式資料庫,其中:

福建節點:fj.jtyz

福建廈門節點:xm.fj.jtyz

江西:jx.jtyz

江西上饒:sr.jx.jtyz

這就是資料庫域名。

資料庫域名在存在於引數檔案中,他的引數是db_domain.

查詢資料庫域名

方法一:select valuefrom v$parameter where name = 'db_domain';

方法二:show parameterdomain

方法三:在引數檔案中查詢。

全域性資料庫名

全域性資料庫名=資料庫名+資料庫域名,如前述福建節點的全域性資料庫名是:oradb.fj.jtyz

四、資料庫服務名

什麼是資料庫服務名?

oracle9i版本開始,引入了一個新的引數,即資料庫服務名。引數名是SERVICE_NAME

如果資料庫有域名,則資料庫服務名就是全域性資料庫名;否則,資料庫服務名與資料庫名相同。

查詢資料庫服務名

方法一:select valuefrom v$parameter where name = 'service_name';

方法二:show parameterservice_name

方法三:在引數檔案中查詢。

五、DG、RAC環境下相關名稱差異對比

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