oracle Service Name和SID的區別


數據庫名(DB_NAME)、實例名(Instance_name)、以及操作系統環境變量(ORACLE_SID) 
在ORACLE7、8數據庫中只有數據庫名(db_name)和數據庫實例名(instance_name)。在ORACLE8i、9i中出現了新的參數,即數據庫域名(db_domain)、服務名(service_name)、以及操作系統環境變量(ORACLE_SID)。這些都存在於同一個數據庫中的標識,用於區分不同數據庫的參數。 
一、什么是數據庫名(db_name)? 
數據庫名是用於區分數據的內部標識,是以二進制方式存儲於數據庫控制文件中的參數,在數據安裝或創建之后將不得修改。數據庫安裝完成后,該參數被寫入數據庫參數文件pfile中,格式如下: 
......... 
db_name="orcl" #(不允許修改) 
db_domain=dbcenter.toys.com 
instance_name=orcl 
service_names=orcl.dbcenter.toys.com 
control_file=(............... 
.........
 
 
在每一個運行的ORACLE8i數據庫中都有一個數據庫名(db_name),如果一個服務器程序中創建了兩個數據庫,則有兩個數據庫名。其控制參數據分屬在不同的pfile中控制着相關的數據庫。
 
 
二、什么是數據庫實例名(instance_name)
 
 
數據庫實例名則用於和操作系統之間的聯系,用於對外部連接時使用。在操作系統中要取得與數據庫之間的交互,必須使用數據庫實例名。例如,要和某一個數據庫server連接,就必須知道其數據庫實例名,只知道數據庫名是沒有用的,與數據庫名不同,在數據安裝或創建數據庫之后,實例名可以被修改。數據庫安裝完成后,該實例名被寫入數據庫參數文件pfile中,格式如下:
 
db_name="orcl" #(不允許修改) 
db_domain=dbcenter.toys.com 
instance_name=orcl #(可以修改,可以與db_name相同也可不同) 
service_names=orcl.dbcenter.toys.com 
control_file=(........................
 
 
數據庫名與實例名之間的關系
 
 
數據庫名與實例名之間的關系一般是一一對應關系,有一個數據庫名就有一個實例名,如果在一個服務器中創建兩個數據庫,則有兩個數據庫名,兩個數據庫實例名,用這兩個標識(數據庫名和實例名)確定一個數據庫,用戶和實例相連接。 
但在8i、9i的並行服務器結構中,數據庫與實例之間不存在一一對應關系,而是一對多關系,(一個數據庫對應多個實例,同一時間內用戶只一個實例相聯系,當某一實例出現故障,其它實例自動服務,以保證數據庫安全運行。)
 
 
三、操作系統環境變量(ORACLE_SID)
 
 
在實際中,對於數據庫實例名的描述有時使用實例名(instance_name)參數,有時使用ORACLE_SID參數。這兩個都是數據庫實例名,它們有什么區別呢?(經常弄混) 
 
(ORACLE_SID) 
OS<----------------> ORACLE 數據庫 <--------(Instance_name(實例名)) 
 
上圖表示實例名instance_name、ORACLE_SID與數據庫及操作系統之間的關系,雖然這里列出的兩個參數都是數據庫實例名,但instance_name參數是ORACLE數據庫的參數,此參數可以在參數文件中查詢到,而ORACLE_SID參數則是操作系統環境變量。 
操作系統環境變量ORACLE_SID用於和操作系統交互。也就是說,在操作系統中要想得到實例名,就必須使用ORACLE_SID。此參數與ORACLE_BASE、ORACLE_HOME等用法相同。在數據庫安裝之后,ORACLE_SID被用於定義數據庫參數文件的名稱。如: 
$ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora。
 
定義方法: 
 
export ORACLE_SID=orcl 
 
如果在同一服務器中創建了多個數據庫,則必然同時存在多個數據庫實例,這時可以重復上述定義過程,以選擇不同實例。 
還可以用
 
 
[oracle@Datacent]$ . oraenv
 
來切換不同的ORACLE_SID來通過操作系統來啟動不同的實例(instance)
 
===================================================================================
 
數據庫名:db_name           
數據庫實例名:instance_name 
操作系統環境變量:oracle_sid 
數據庫服務名:service_names 
數據庫域名:db_domain        
全局數據庫名:global_db_name 
 
在oracle7、oracle8數據庫中只有數據庫名以及實例名,在oracle8i、oracle9i中出現了數據庫域名、服務名以及全局數據庫名。 
 
數據庫名(db_name):用於區分一個數據的內部標識,是oracle的內部標記,是以二進制方式存儲於數據庫控制文件的參數。 
數據庫名的作用:數據庫名是數據庫的內部管理標記,在安裝數據庫、創建新的的數據庫、創建數據庫控制文件、修改數據庫結構、使用數據庫備份與恢復工具進行數據庫備份時都需要使用數據名。 
數據庫安裝完成后,數據庫名稱存儲在參數文件(pfile,spfile)中,同時以二進制方式存儲在控制文件中,兩者必須匹配。如果兩者不匹配,數據庫在啟動時提示ORA-01103號錯誤。 
■ 對數據名稱的查詢: 
1、查詢參數文件 db_name的數值 
2、select name from v$database 
3、SQL>show parameter db_name 
■ 修改數據庫名(修改復雜,建議不要修改) 
1、修改參數文件的數據庫名稱。 
2.重建數據庫的控制文件。 
 
數據庫實例名(instance_name):用於和操作系統之間的聯系。 
操作系統與數據庫之間的交互則必須使用數據庫實例名。數據庫安裝完成后,數據庫實例名稱存儲在參數文件中,同時存儲在注冊表中。 
數據庫名與實例名一般是一一對應的關系,即:有一個數據庫名就有一個實例名,而在oracle9i的並行服務器結構中是一對多的關系,即:一個數據庫對應多個實例。 
■ 對數據名稱的查詢: 
1、查詢參數文件 instance_name的數值 
2、select instance_name from v$instance 
3、SQL>show parameter instance_name 
 
操作系統環境變量(oracle_sid):用於與數據庫實例名相對應。instance_name是oracle數據庫參數 -oracle_sid是操做系統環境變量,即在操作系統要得到實例名必須通過操做系統環境變量oracle_sid,oracle_sid與 instance_name必須相同。 
是數據庫和操作系統的接口,由操作系統使用,是操作系統區分多個數據庫的依據。oracle_sid存儲在注冊表中。如果數據庫的oracle_sid與實際的instance_name不同,在操作系統下運行的oracle所有命令將產生錯誤。 
■ 對數據實例名的定義: 
SQL>set oracle_sid=數據庫實例名 
 
數據庫域名(db_domain):在數據庫名稱后增加域名構成,使得數據庫的取名在整個網絡環境中惟一,主要用於oralce分布式環境中數據的遠程復制。數據庫域名存儲在參數文件中。 
以下情況要考慮使用數據庫域名:1、在oracle分布式環境下,兩個數據庫之間要通過數據鏈路進行數據的遠程傳輸。2、在同一網絡環境下,兩個數據庫名相同。 
■ 對數據庫域名的查詢: 
1、查詢參數文件 db_domain的數值 
2、select value from v$parameter where name='db_domain' 
3、SQL>show parameter db_domain 
■ 修改數據庫域名: 
1、關閉數據庫 
2、修改數據庫參數文件中的db_domain、service_names。 
 
數據庫服務名service_names:數據庫名+數據庫域名,意義與全局數據庫名相同。 
數據庫服務名存儲在參數文件中。 
■ 對數據庫服務名的查詢: 
1、查詢參數文件 service_names的數值 
2、select value from v$parameter where name='service_names' 
3、SQL>show parameter service_names 
 
全局數據庫名global_db_name:數據庫名+數據庫域名。 
 
 
數據庫實例名、服務名與網絡連接 
ORACLE服務器版本 客戶端網絡驅動 
ORACLE7   (支持實例名) SQL_NET(支持實例名) 
ORACLE8   (支持實例名) NET8 (支持實例名) 
ORACLE8i 
(支持實例名、服務名) NET8i (支持實例名、服務名) 
ORACLE9i 
(支持實例名、服務名) ORACLE NET SERVICE 
(支持實例名、服務名) 
對於網絡連接字符串使用實例名、服務名的問題,需要根據客戶端驅動的版本和oracle服務器的版本共同確定,即兩者都支持實例名和服務名的使用服務名,否則使用實例名。
 
====================================================================================
 
1. SID是實例名,實例名指的是用於響應某個數據庫操作的數據庫管理系統的名稱。實例名是由初始化參數文件的參數instance_name決定的。如果這個參數不被指定(即instance_name沒有被指定為任何值),那么實例的名字由該用戶的環境變量ORACLE_SID(注意這里是大寫)決定。在windows平台下,則是注冊表中oracle_sid值決定。
 
 
2. SERVICE_NAME指的是listener中的全局數據庫名:這個名字是由listener.ora中GLOBAL_DBNAME參數決定的。這個名字代表的是客戶端連接到數據庫時,tnsnames.ora中SERVICE_NAME參數所對應的值。
 
3. 連接字符串
 
    配置tnsname.ora時,可以用SID,也可以用SERVICE_NAME.  注意這兩個值不一定相同,具體要看數據庫服務器中的配置。
 
connect_str =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = xxxx
    )
  )
 
connect_str =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = xxx)
      (SERVER = DEDICATED)
    )
  )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM