oracle中的全局數據庫名稱和sid的區別
在ORACLE7、8數據庫中只有數據庫名(db_name)和數據庫實例名(instance_name)。在ORACLE8i、9i中出現了新的參數,即數據庫域名(db_domain)、服務名(service_name)、以及操作系統環境變量(ORACLE_SID)。這些都存在於同壹個數據庫中的標識,用於區分不同數據庫的參數。
壹、什麽是數據庫名(db_name)?
數據庫名是用於區分數據的內部標識,是以二進制方式存儲於數據庫控制文件中的參數,在數據安裝或創建之後將不得修改。數據庫安裝完成後,該參數被寫入數據庫參數文件pfile中,格式如下:
[code:1:1aaf156970]
.........
db_name="orcl" #(不允許修改)
db_domain=dbcenter.toys.com
instance_name=orcl
service_names=orcl.dbcenter.toys.com
control_file=(...............
.........
[/code:1:1aaf156970]
在每壹個運行的ORACLE8i數據庫中都有壹個數據庫名(db_name),如果壹個服務器程序中創建了兩個數據庫,則有兩個數據庫名。其控制參數據分屬在不同的pfile中控制著相關的數據庫。
二、什麽是數據庫實例名(instance_name)
數據庫實例名則用於和操作系統之間的聯系,用於對外部連接時使用。在操作系統中要取得與數據庫之間的交互,必須使用數據庫實例名。例如,要和某壹個數據庫server連接,就必須知道其數據庫實例名,只知道數據庫名是沒有用的,與數據庫名不同,在數據安裝或創建數據庫之後,實例名可以被修改。數據庫安裝完成後,該實例名被寫入數據庫參數文件pfile中,格式如下:
[code:1:1aaf156970]
db_name="orcl" #(不允許修改)
db_domain=dbcenter.toys.com
instance_name=orcl #(可以修改,可以與db_name相同也可不同)
service_names=orcl.dbcenter.toys.com
control_file=(...............
.........
[/code:1:1aaf156970]
數據庫名與實例名之間的關系。
數據庫名與實例名之間的關系壹般是壹壹對應關系,有壹個數據庫名就有壹個實例名,如果在壹個服務器中創建兩個數據庫,則有兩個數據庫名,兩個數據庫實例名,用兩個標識確定壹個數據庫,用戶和實例相連接。
但在8i、9i的並行服務器結構中,數據庫與實例之間不存在壹壹對應關系,而是壹對多關系,(壹個數據庫對應多個實例,同壹時間內用戶只壹個實例相聯系,當某壹實例出現故障,其它實例自動服務,以保證數據庫安全運行。)
三、操作系統環境變量(ORACLE_SID)
在實際中,對於數據庫實例名的描述有時使用實例名(instance_name)參數,有時使用ORACLE_SID參數。這兩個都是數據庫實例名,它們有什麽區別呢?(經常弄混)
[code:1:1aaf156970]
(ORACLE_SID)
OS<----------------> ORACLE 數據庫 <--------(Instance_name(實例名))
[/code:1:1aaf156970]
上圖表示實例名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。
定義方法:
[code:1:1aaf156970]
export ORACLE_SID=orcl
[/code:1:1aaf156970]
如果在同壹服務器中創建了多個數據庫,則必然同時存在多個數據庫實例,這時可以重復上述定義過程,以選擇不同實例。
還可以用
[code:1:1aaf156970]
[oracle@Datacent]$ . oraenv
[/code:1:1aaf156970]
來切換不同的ORACLE_SID來通過操作系統來啟動不同的實例(instance)