Oracle數(shù)據(jù)庫名與Oracle實(shí)例名的關(guān)系
1 數(shù)據(jù)庫名
1.1 數(shù)據(jù)庫名的概念
數(shù)據(jù)庫名(db_name)就是一個數(shù)據(jù)庫的標(biāo)識,就像人的身份證號一樣帚称。如果一臺機(jī)器上裝了多個數(shù)據(jù)庫捍岳,那么每一個數(shù)據(jù)庫都有一個數(shù)據(jù)庫名。在數(shù)據(jù)庫安裝或創(chuàng)建完成之后瞒窒,參數(shù)DB_NAME被寫入?yún)?shù)文件之中蒂培。
數(shù)據(jù)庫名在$ORACLE_HOME/admin/db_name/pfile/init.ora(或$ORACLE_BASE/admin/db_name/pfile/init.ora或$ORACLE_HOME/dbs/SPFILE<實(shí)例名>.ORA)文件中
###########################################
Database Identification
###########################################
db_domain=""
db_name=orcl
在創(chuàng)建數(shù)據(jù)庫時就應(yīng)考慮好數(shù)據(jù)庫名,并且在創(chuàng)建完數(shù)據(jù)庫之后,數(shù)據(jù)庫名不宜修改,即使要修改也會很麻煩。因?yàn)槭成耄瑪?shù)據(jù)庫名還被寫入控制文件中,控制文件是以二進(jìn)制型式存儲的澎现,用戶無法修改控制文件的內(nèi)容仅胞。假設(shè)用戶修改了參數(shù)文件中的數(shù)據(jù)庫名,即修改DB_NAME的值剑辫。但是在Oracle啟動時干旧,由于參數(shù)文 件中的DB_NAME與控制文件中的數(shù)據(jù)庫名不一致,導(dǎo)致數(shù)據(jù)庫啟動失敗妹蔽,將返回ORA-01103錯誤椎眯。
1.2 數(shù)據(jù)庫名的作用
數(shù)據(jù)庫名是在安裝數(shù)據(jù)庫、創(chuàng)建新的數(shù)據(jù)庫胳岂、創(chuàng)建數(shù)據(jù)庫控制文件编整、修改數(shù)據(jù)結(jié)構(gòu)、備份與恢復(fù)數(shù)據(jù)庫時都需要使用到的(注意這些時候不能使用sid乳丰,還有alter database時都是使用數(shù)據(jù)庫名)掌测。
有很多Oracle安裝文件目錄是與數(shù)據(jù)庫名相關(guān)的,如:
winnt: F:\oracle\product\10.2.0\oradata\DB_NAME\...
又如參數(shù)文件pfile:
winnt: F:\oracle\product\10.2.0\admin\DB_NAME\pfile\init.ora.54200885729
如果控制文件損壞或丟失产园,數(shù)據(jù)庫將不能加載汞斧,這時要重新創(chuàng)建控制文件,方法是以nomount方式啟動實(shí)例什燕,然后以create controlfile命令創(chuàng)建控制文件粘勒,當(dāng)然這個命令中也要指明DB_NAME。
1.3 修改數(shù)據(jù)庫名
建議:應(yīng)在創(chuàng)建數(shù)據(jù)庫時就確定好數(shù)據(jù)庫名秋冰,數(shù)據(jù)庫名不應(yīng)作修改仲义,因?yàn)樾薷臄?shù)據(jù)庫名是一件比較復(fù)雜的事情婶熬。是區(qū)分?jǐn)?shù)據(jù)的內(nèi)部標(biāo)識(即是給Oracle數(shù)據(jù)庫內(nèi)部使用的)剑勾,因?yàn)槠湓跀?shù)據(jù)庫多處保存,并且控制文件中保存的是二進(jìn)制的赵颅,所以很難改變其名字虽另。
在已創(chuàng)建數(shù)據(jù)之后,修改數(shù)據(jù)庫名饺谬。步驟如下:
(1)關(guān)閉數(shù)據(jù)庫捂刺。
(2)修改數(shù)據(jù)庫參數(shù)文件中的DB_NAME參數(shù)的值為新的數(shù)據(jù)庫名谣拣。
(3)以NOMOUNT方式啟動實(shí)例,修建控制文件(有關(guān)創(chuàng)建控制文件的命令語法族展,請參考o(jì)racle文檔)
1.4 查詢當(dāng)前數(shù)據(jù)庫名
方法一:select name from v$database;
方法二:show parameter db
方法三:查看參數(shù)文件森缠,$ORACLE_HOME/admin/db_name/pfile/init.ora(或$ORACLE_BASE/admin/db_name/pfile/init.ora)
2 數(shù)據(jù)庫實(shí)例名(instance name)
2.1 數(shù)據(jù)庫實(shí)例名的概念(instance_name)
實(shí)例名是代表用于加載或打開一個數(shù)據(jù)庫所用的memory structures + Background process (MEM + BGP)。在unix中仪缸,實(shí)例名由ORACLE_SID環(huán)境變量定義贵涵,在windows中由服務(wù)名定義∏』可以用于連接字符串中宾茂,這種用法用于8i版本前,雖然10g仍然支持拴还,但是并不推薦跨晴,因?yàn)檫@種方法缺乏對某些新特性的支持。
實(shí)例是訪問Oracle數(shù)據(jù)庫所需的一部分計(jì)算機(jī)內(nèi)存和輔助處理后臺進(jìn)程片林,是由進(jìn)程和這些進(jìn)程所使用的內(nèi)存(SGA)所構(gòu)成一個集合端盆,它根本不需要一個與其相關(guān)聯(lián)的數(shù)據(jù)庫,沒有任何數(shù)據(jù)文件也可以啟動實(shí)例费封。下面是Oralce的啟動過程:
sqlplus / as sysdba
sql>startup nomount #啟動了一個實(shí)例爱谁,現(xiàn)在SGA分配了,進(jìn)程在運(yùn)行孝偎,除數(shù)據(jù)庫外所有的東西都啟動了
sql>alter database mount #利用控制文件(init.ora文件中指定)定位重作日志文件访敌、數(shù)據(jù)文件、臨時文件
sql>alter database open #數(shù)據(jù)庫可供任何人通過這個實(shí)例訪問衣盾。
所以可以這么理解:訪問Oracle都是訪問一個實(shí)例寺旺,但這個實(shí)例如果關(guān)聯(lián)了數(shù)據(jù)庫文件,就是可以訪問的势决,如果沒有阻塑,就會得到實(shí)例不可用的錯誤。
實(shí)例名指的是用于響應(yīng)某個數(shù)據(jù)庫操作的數(shù)據(jù)庫管理系統(tǒng)的名稱果复,也叫SID陈莽。實(shí)例名是由參數(shù)instance_name決定的。如果這個參數(shù)不被指定(即instance_name沒有被指定為任何值)虽抄,那么實(shí)例的名字由該用戶的環(huán)境變量ORACLE_SID(注意這里是大寫)決定走搁。在windows平臺下,則是注冊表中oracle_sid值決定迈窟。
實(shí)例名和SID是一一對應(yīng)的私植,名字相同,但存儲位置不同车酣。
2.2 實(shí)例和數(shù)據(jù)庫
實(shí)例和數(shù)據(jù)庫之間的區(qū)別如下:
(1)實(shí)例是臨時的曲稼,它只在相關(guān)的進(jìn)程和內(nèi)存集合存在時存在索绪;數(shù)據(jù)庫是永久的,只要文件存在它就存在贫悄。
(2)一個實(shí)例在其生存期內(nèi)可安裝和打開單個數(shù)據(jù)庫瑞驱;數(shù)據(jù)庫可以被很多實(shí)例安裝和打開,或者一個接一個的實(shí)例安裝和打開窄坦,或者由多個實(shí)例同時安裝和打開(RAC)钱烟。
簡單來說RAC就是多個實(shí)例同時打開一個數(shù)據(jù)庫文件的系統(tǒng),在結(jié)構(gòu)上是多臺機(jī)器嫡丙,每臺機(jī)器運(yùn)行一個實(shí)例拴袭,每個實(shí)例都打開同一個數(shù)據(jù)庫 (這個是用磁盤共享技術(shù)實(shí)現(xiàn)的),這些實(shí)例之間需要同步高速緩存曙博,這樣保證多個實(shí)例是完全一致的拥刻,不會相互沖突乃至覆蓋。
數(shù)據(jù)庫實(shí)例名(instance_name)用于對外部連接父泳。在操作系統(tǒng)中要取得與數(shù)據(jù)庫的聯(lián)系般哼,必須使用數(shù)據(jù)庫實(shí)例名。例如惠窄,要去連接一個數(shù)據(jù)庫服務(wù)器蒸眠,就必須知道其數(shù)據(jù)庫實(shí)例名,只知道數(shù)據(jù)庫名是沒有用的杆融。與數(shù)據(jù)庫名不同楞卡,在數(shù)據(jù)安裝或創(chuàng)建數(shù)據(jù)庫之后,實(shí)例名可以被修改脾歇。數(shù)據(jù)庫名和實(shí)例名可以相同也可以不同蒋腮。在一般情況下,數(shù)據(jù)庫名和實(shí)例名是一對一的關(guān)系藕各,但如果在oracle并行服務(wù)器架構(gòu)(即oracle實(shí)時應(yīng)用集群) 中池摧,數(shù)據(jù)庫名和實(shí)例名是一對多的關(guān)系(一個數(shù)據(jù)庫對應(yīng)多個實(shí)例,同一時間內(nèi)用戶只與一個實(shí)例相聯(lián)系激况,當(dāng)某一實(shí)例出現(xiàn)故障作彤,其它實(shí)例自動服務(wù),以保證數(shù)據(jù)庫安全運(yùn)行) 乌逐。
實(shí)例就是一組操作系統(tǒng)進(jìn)程(或者是一個多線程的進(jìn)程)以及一些內(nèi)存竭讳,這些進(jìn)程可以操作數(shù)據(jù)庫;而數(shù)據(jù)庫只是一個文件集合(包括數(shù)據(jù)文件黔帕、臨時文件代咸、重做日志文件和控制文件)。在任何時刻成黄,一個實(shí)例只能有一組相關(guān)的文件(與一個數(shù)據(jù)庫關(guān)聯(lián))呐芥。大多數(shù)情況下,反過來也成立:一個數(shù)據(jù)庫上只有一個實(shí)例對其進(jìn)行操作奋岁。不過思瘟,Oracle的應(yīng)用集群(Real Application Clusters,RAC)是一個例外闻伶,這是Oracle提供的一個選項(xiàng)滨攻,允許在集群環(huán)境中的多臺計(jì)算機(jī)上操作,這樣就可以有多臺實(shí)例同時裝載并打開一個數(shù)據(jù)庫(位于一組共享物理磁盤上)蓝翰。由此光绕,我們可以同時從多臺不同的計(jì)算機(jī)訪問這個數(shù)據(jù)庫。Oracle RAC能支持高度可用的系統(tǒng)畜份,可用于構(gòu)建可擴(kuò)縮性極好的解決方案诞帐。
2.3 查詢當(dāng)前數(shù)據(jù)庫實(shí)例名
方法一:select instance_name from v$instance;
方法二:show parameter instance
3 ORACLE_SID(環(huán)境變量)
在實(shí)際中,對于數(shù)據(jù)庫實(shí)例的標(biāo)識有時使用實(shí)例名爆雹,有時使用ORACLE_SID停蕉,它們有什么區(qū)別呢?(非常容易混淆)
OS(ORACLE_SID)<----------------> ORACLE 數(shù)據(jù)庫 <--------(instance_name(實(shí)例名))
上圖表示實(shí)例名instance_name钙态、ORACLE_SID與數(shù)據(jù)庫及操作系統(tǒng)之間的關(guān)系慧起,雖然這里列出的兩個參數(shù)都是數(shù)據(jù)庫實(shí)例名,但 instance_name參數(shù)是ORACLE數(shù)據(jù)庫的參數(shù)册倒,此參數(shù)可以在參數(shù)文件中查詢到蚓挤;而ORACLE_SID參數(shù)則是操作系統(tǒng)環(huán)境變量,與 ORACLE_BASE驻子、ORACLE_HOME等用法相同屈尼,用于和操作系統(tǒng)交互。也就是說拴孤,在操作系統(tǒng)中要想得到實(shí)例名脾歧,就必須使用ORACLE_SID。且ORACLE_SID必須與instance_name的值一致演熟,否則鞭执,你將會收到一個錯誤,在winnt平臺芒粹,是“TNS:協(xié)議適配器錯誤”兄纺。
在數(shù)據(jù)庫安裝之后,ORACLE_SID被用于定義數(shù)據(jù)庫參數(shù)文件的名稱化漆。如:
$ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora估脆。
如果在同一服務(wù)器中創(chuàng)建了多個數(shù)據(jù)庫,則必然同時存在多個數(shù)據(jù)庫實(shí)例,這時可以重復(fù)定義過程(export ORACLE_SID=orcl)座云,以選擇不同實(shí)例疙赠。 還可以用oraenv命令行來切換不同的ORACLE_SID來通過操作系統(tǒng)來啟動不同的實(shí)例(instance)
4 數(shù)據(jù)庫域名與全局?jǐn)?shù)據(jù)庫名
4.1 概念與聯(lián)系
使用數(shù)據(jù)庫名(da_name)對一個數(shù)據(jù)庫進(jìn)行唯一標(biāo)識付材,這種表示對于單個數(shù)據(jù)庫是足夠的,但是隨著由多個數(shù)據(jù)庫構(gòu)成的分布式數(shù)據(jù)庫的普及圃阳,這給數(shù)據(jù)庫的管理造成一定的負(fù)擔(dān)厌衔,因?yàn)楦鱾€數(shù)據(jù)庫的名字可能一樣,造成管理上的混亂捍岳。為了解決這種情況富寿,引入了db_domain參數(shù),這樣數(shù)據(jù)庫的標(biāo)識是由db_name和db_domain兩個參數(shù)共同決定的锣夹,避免了因?yàn)閿?shù)據(jù)庫重名而造成管理上的混亂页徐。這類似于互連網(wǎng)上的機(jī)器名的管理。我們 將db_name和db_domain兩個參數(shù)用‘.’連接起來银萍,表示一個數(shù)據(jù)庫变勇,并將該數(shù)據(jù)庫的名稱稱為global_name,即它擴(kuò)展了 db_name砖顷。db_name參數(shù)只能由字母贰锁、數(shù)字、’_’滤蝠、’#’豌熄、’$’組成,而且最多8個字符物咳。
數(shù)據(jù)庫域名(db_domain):定義一個數(shù)據(jù)庫所在的域锣险,該域的命名同互聯(lián)網(wǎng)的“域”沒有任何關(guān)系,只是數(shù)據(jù)庫管理員為了更好的管理分布式數(shù)據(jù)庫而根據(jù)實(shí)際情況決定的览闰。當(dāng)然為了管理方便芯肤,可以將其看作互聯(lián)網(wǎng)的域。
全局?jǐn)?shù)據(jù)庫名(global_name):對一個數(shù)據(jù)庫(Oracle database)的唯一標(biāo)識压鉴,oracle建議用此種方法標(biāo)識數(shù)據(jù)庫崖咨。該值是在創(chuàng)建數(shù)據(jù)庫時決定的,缺省值為db_name. db_domain油吭。在以后對參數(shù)文件中db_name與db_domain參數(shù)的任何修改不影響global_name的值击蹲,如果要修改 Global_name,只能用alter database rename global_name to <db_name.db_domain>命令進(jìn)行修改婉宰,然后修改相應(yīng)參數(shù)歌豺。
4.2查詢數(shù)據(jù)庫域名
方法一:select value from v$parameter where name = 'db_domain';(10g中不可行)
方法二:show parameter domain
方法三:在參數(shù)文件中查詢,$ORACLE_HOME/admin/db_name/pfile/init.ora(或$ORACLE_BASE/admin/db_name/pfile/init.ora)
4.3 例子
全國交通GIS系統(tǒng)的分布式數(shù)據(jù)庫心包,其中:
吉林節(jié)點(diǎn): jl.jtgis
吉林長春節(jié)點(diǎn): cc.jl.jtgis
河北節(jié)點(diǎn): hb.jtgis
河北石家莊節(jié)點(diǎn):sjz.hb.jtgis
這些就是數(shù)據(jù)庫域名类咧,數(shù)據(jù)庫域名在存在于參數(shù)文件中,她的參數(shù)是db_domain.
全局?jǐn)?shù)據(jù)庫名=數(shù)據(jù)庫名+數(shù)據(jù)庫域名,如前述福建節(jié)點(diǎn)的全局?jǐn)?shù)據(jù)庫名是:orcl.jl.jtgis
5 數(shù)據(jù)庫服務(wù)名(service_name)
該參數(shù)是oracle8i新引進(jìn)的痕惋。在8i以前区宇,我們用SID來表示數(shù)據(jù)庫的一個實(shí)例,但是在Oracle的并行環(huán)境中血巍,一個數(shù)據(jù)庫對應(yīng)多個實(shí)例萧锉,這樣就需要多網(wǎng)絡(luò)服務(wù)名珊随,設(shè)置繁瑣述寡。為了方便并行環(huán)境中的設(shè)置,引進(jìn)了service_name參數(shù)叶洞。該參數(shù)對應(yīng)一個數(shù)據(jù)庫鲫凶,而不是一個實(shí)例,而且該參數(shù)有許多其它的好處衩辟。
該參數(shù)的缺省值為db_name.db_domain螟炫,即等于global_name。如果數(shù)據(jù)庫有域名艺晴,則數(shù)據(jù)庫服務(wù)名就是全局?jǐn)?shù)據(jù)庫名昼钻;否則,數(shù)據(jù)庫服務(wù)名與數(shù)據(jù)庫名相同封寞。一個數(shù)據(jù)庫可以對應(yīng)多個service_name然评,以便實(shí)現(xiàn)更靈活的配置。該參數(shù)與SID沒有直接關(guān)系狈究,即 service_name 不必與SID一樣碗淌。
從Oracle8i開始的oracle網(wǎng)絡(luò)組件,數(shù)據(jù)庫與客戶端連接的主機(jī)字符串推薦使用的是數(shù)據(jù)庫服務(wù)名抖锥。之前用的是SID亿眠,即數(shù)據(jù)庫實(shí)例名。
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拯勉。
查詢數(shù)據(jù)庫服務(wù)名(方法二測試可行)
方法一:select value from v$parameter where name = 'service_name';(10g中不可行)
方法二:show parameter service_name
6 網(wǎng)絡(luò)服務(wù)名(net_service_name)
網(wǎng)絡(luò)服務(wù)名(net_service_name)竟趾,又可以稱為數(shù)據(jù)庫別名(database alias),是客戶端程序訪問數(shù)據(jù)庫時所需要谜喊,屏蔽了客戶端如何連接到服務(wù)器端的細(xì)節(jié)潭兽,實(shí)現(xiàn)了數(shù)據(jù)庫的位置透明的特性。網(wǎng)絡(luò)服務(wù)名被記錄在 tnsnames.ora文件中斗遏。
可以通過netmgr來新建網(wǎng)絡(luò)服務(wù)名山卦。
網(wǎng)絡(luò)服務(wù)名是從客戶端的角度出發(fā),當(dāng)客戶端連接遠(yuǎn)程數(shù)據(jù)庫或其他服務(wù)時,可以指定網(wǎng)絡(luò)服務(wù)名账蓉。因此需要使用一個或多個命名方法將此Net服務(wù)名解析為連接數(shù)據(jù)庫或其他服務(wù)的連接描述符枚碗,命名方法如下:
[本地]——將存儲在本地客戶機(jī)的tnsnames.ora文件中的網(wǎng)絡(luò)服務(wù)名解析為連接描述符。
[Oracle Names]——由Oracle名字服務(wù)器提供為網(wǎng)絡(luò)上的每個Oracle Net服務(wù)提供解析方法
[主機(jī)名]——通過TCP/IP環(huán)境中的主機(jī)別名連接到Oracle數(shù)據(jù)庫服務(wù)
[Sun NIS]/[DCE CDS]——專用系統(tǒng)用的铸本,在Windows 2000系統(tǒng)環(huán)境下不適用