剛接觸ORACLE的人肯定會對實(shí)例和數(shù)據(jù)庫感到困惑,實(shí)例到底代表些什么?為什么會有這個概念的出現(xiàn)?
ORACLE實(shí)例 = 進(jìn)程 + 進(jìn)程所使用的內(nèi)存(SGA)
實(shí)例是一個臨時性的東西,你也可以認(rèn)為它代表了數(shù)據(jù)庫某一時刻的狀態(tài)!
數(shù)據(jù)庫 = 重做文件 + 控制文件 + 數(shù)據(jù)文件 + 臨時文件
數(shù)據(jù)庫是永久的,是一個文件的集合。
ORACLE實(shí)例和數(shù)據(jù)庫之間的關(guān)系
1.
臨時性和永久性
2.
實(shí)例可以在沒有數(shù)據(jù)文件的情況下單獨(dú)啟動 startup nomount , 通常沒什么意義
3.
一個實(shí)例在其生存期內(nèi)只能裝載(alter database mount)和打開(alter database open)一個數(shù)據(jù)庫
4.
一個數(shù)據(jù)庫可被許多實(shí)例同時裝載和打開(即RAC),RAC環(huán)境中實(shí)例的作用能夠得到充分的體現(xiàn)!
下面對實(shí)例和數(shù)據(jù)庫做詳細(xì)的詮釋:
在 Oracle 領(lǐng)域中有兩個詞很容易混淆,這就是“實(shí)例”( instance )和“數(shù)據(jù)庫”( database )。作為 Oracle 術(shù)語,這兩個詞的定義如下:
q
數(shù)據(jù)庫 ( database ):物理操作系統(tǒng)文件或 磁盤 ( disk )的集合。使用 Oracle 10 g 的自動存儲管理( Automatic Storage Management , ASM )或 RAW 分區(qū)時,數(shù)據(jù)庫可能不作為操作系統(tǒng)中單獨(dú)的文件,但定義仍然不變。
q
實(shí)例 ( instance ):一組 Oracle 后臺進(jìn)程 / 線程以及一個共享內(nèi)存區(qū),這些內(nèi)存由同一個計(jì)算機(jī)上運(yùn)行的線程 / 進(jìn)程所共享。這里可以維護(hù)易失的、非持久性內(nèi)容(有些可以刷新輸出到磁盤)。就算沒有磁盤存儲,數(shù)據(jù)庫實(shí)例也能存在。也許實(shí)例不能算是世界上最有用的事物,不過你完全可以把它想成是最有用的事物,這有助于對 實(shí)例 和 數(shù)據(jù)庫 劃清界線。
這兩個詞有時可互換使用,不過二者的概念完全不同。實(shí)例和數(shù)據(jù)庫之間的關(guān)系是:數(shù)據(jù)庫可以由多個實(shí)例 裝載 和 打開 ,而實(shí)例可以在任何時間點(diǎn) 裝載 和 打開 一個數(shù)據(jù)庫。實(shí)際上,準(zhǔn)確地講,實(shí)例在其整個生存期中最多能裝載和打開一個數(shù)據(jù)庫!稍后就會介紹這樣的一個例子。
是不是更糊涂了?我們還會做進(jìn)一步的解釋,應(yīng)該能幫助你搞清楚這些概念。實(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ò)縮性極好的解決方案。
下面來看一個簡單的例子。假設(shè)我們剛安裝了 Oracle 10 g 10.1.0.3 。我們執(zhí)行一個純軟件安裝,不包括初始的“啟動”數(shù)據(jù)庫,除了軟件以外什么都沒有。
通過 pwd 命令可以知道當(dāng)前的工作目錄(這個例子使用一個 Linux 平臺的計(jì)算機(jī))。我們的當(dāng)前目錄是 dbs (如果在 Windows 平臺上,則是 database 目錄)。執(zhí)行 ls – l 命令顯示出這個目錄為“空”。其中沒有 init.ora? 文件,也沒有任何 存儲參數(shù)文件 ( stored parameter file , SPFILE );存儲參數(shù)文件將在第 3 章詳細(xì)討論。
使用 ps (進(jìn)程 狀 態(tài))命令,可以看到用戶 ora10g 運(yùn)行的所有進(jìn)程,這里假設(shè) ora10g 是 Oracle 軟件的所有者。此時還沒有任何 Oracle 數(shù)據(jù)庫進(jìn)程。
然后使用 ipcs 命令,這個 UNIX 命令可用于顯示進(jìn)程間的通信設(shè)備,如共享內(nèi)存、信號量 等。目前系統(tǒng)中沒有使用任何通信設(shè)備。
然后啟動 SQL*Plus ( Oracle 的命令行界面),并作為 SYSDBA 連接( SYSDBA 賬戶可以在數(shù)據(jù)庫中做任何事情)。連接成功后, SQL*Plus 報(bào)告稱我們連上了一個空閑的實(shí)例:
我們的“實(shí)例”現(xiàn)在只包括一個 Oracle 服務(wù)器進(jìn)程,見以下輸出中粗體顯示的部分。此時還沒有分配共享內(nèi)存,也沒有其他進(jìn)程。
現(xiàn)在來啟動實(shí)例:
這里提示的文件就是啟動實(shí)例時必須要有的一個文件,我們需要有一個參數(shù)文件(一種簡單的平面文件,后面 還 會詳細(xì)說明),或者要有一個存儲參數(shù)文件 。現(xiàn)在就來創(chuàng)建參數(shù)文件,并放入啟動數(shù)據(jù)庫實(shí)例所需的最少信息(通常還會指定更多的參數(shù),如數(shù)據(jù)庫塊大小、控制文件位置,等等)。
然后再回到 SQL*Plus :
這里對 startup 命令加了 nomount 選項(xiàng),因?yàn)槲覀儸F(xiàn)在還不想真正“裝載”數(shù)據(jù)庫(要了解啟動和關(guān)閉的所有選項(xiàng),請參見 SQL*Plus 文檔)。
注意
在 Windows 上運(yùn)行 startup 命令之前 , 還需要使用 oradim.exe 實(shí)用程序執(zhí)行一條服務(wù)創(chuàng)建語句。
現(xiàn)在就有了所謂的“實(shí)例”。運(yùn)行數(shù)據(jù)庫所需的后臺進(jìn)程都有了,如進(jìn)程監(jiān)視器( process monitor , PMON )、日志寫入器( log writer , LGWR )等,這些進(jìn)程將在第 5 章詳細(xì)介紹。
再使用 ipcs 命令,它會首次報(bào)告指出使用了共享內(nèi)存和信號量,這是 UNIX 上的兩個重要的進(jìn)程間通信設(shè)備:
注意,我們還沒有“數(shù)據(jù)庫”呢!此時,只有數(shù)據(jù)庫之名(在所創(chuàng)建的參數(shù)文件中),而沒有數(shù)據(jù)庫之實(shí)。如果試圖“裝載”這個數(shù)據(jù)庫,就會失敗,因?yàn)閿?shù)據(jù)庫根本就不存在。下面就來創(chuàng)建數(shù)據(jù)庫。有人說創(chuàng)建一個 Oracle 數(shù)據(jù)庫步驟很繁瑣,真是這樣嗎?我們來看看:
這里創(chuàng)建數(shù)據(jù)庫就是這么簡單。但在實(shí)際中,也許要使用一個稍有些復(fù)雜的 CREATE DATABASE 命令,因?yàn)榭赡苄枰嬖V Oracle 把日志文件、數(shù)據(jù)文件、控制文件等放在哪里。不過,我們現(xiàn)在已經(jīng)有了一個完全可操作的數(shù)據(jù)庫了。可能還需要運(yùn)行 $ORACLE_HOME/rdbms/admin/ catalog.sql 腳本和其他編錄腳本( catalog script )來建立我們每天使用的數(shù)據(jù)字典(這個數(shù)據(jù)庫中還沒有我們使用的某些視圖,如 ALL_OBJECTS ),但不管怎么說,數(shù)據(jù)庫已經(jīng)有了。可以簡單地查詢一些 Oracle V$ 視圖(具體就是 V$DATAFILE 、 V$LOGFILE 和 V$CONTROLFILE ),列出構(gòu)成這個數(shù)據(jù)庫的文件:
Oracle 使用默認(rèn)設(shè)置,把所有內(nèi)容都放在一起,并把數(shù)據(jù)庫創(chuàng)建為一組持久的文件。如果關(guān)閉這個數(shù)據(jù)庫,再試圖打開,就會發(fā)現(xiàn)數(shù)據(jù)庫無法打開:
一個實(shí)例在其生存期中最多只能裝載和打開一個數(shù)據(jù)庫。要想再打開這個(或其他)數(shù)據(jù)庫,必須先丟棄這個實(shí)例,并創(chuàng)建一個新的實(shí)例。
重申一遍:
q
實(shí)例 是一組后臺進(jìn)程和共享內(nèi)存。
q
數(shù)據(jù)庫 是磁盤上存儲的數(shù)據(jù)集合。
q
實(shí)例“一生”只能裝載并打開一個數(shù)據(jù)庫。
q
數(shù)據(jù)庫可以由一個或多個實(shí)例(使用 RAC )裝載和打開。
前面提到過,大多數(shù)情況下,實(shí)例和數(shù)據(jù)庫之間存在一種一對一的關(guān)系。可能正因如此,才導(dǎo)致人們很容易將二者混淆。從大多數(shù)人的經(jīng)驗(yàn)看來,數(shù)據(jù)庫就是實(shí)例,實(shí)例就是數(shù)據(jù)庫。
不過,在許多測試環(huán)境中,情況并非如此。在我的磁盤上,可以有 5 個不同的數(shù)據(jù)庫。測試主機(jī)上任意時間點(diǎn)只會運(yùn)行一個 Oracle 實(shí)例,但是它訪問的數(shù)據(jù)庫每天都可能不同(甚至每小時都不同),這取決于我的需求。只需有不同的配置文件,我就能裝載并打開其中任意一個數(shù)據(jù)庫。在這種情況下,任何時刻我都只有一個“實(shí)例”,但有多個數(shù)據(jù)庫,在任意時間點(diǎn)上只能訪問其中的一個數(shù)據(jù)庫。
所以,你現(xiàn)在應(yīng)該知道,如果有人談到實(shí)例,他指的就是 Oracle 的進(jìn)程和內(nèi)存。提到數(shù)據(jù)庫時,則是說保存數(shù)據(jù)的物理文件。可以從多個實(shí)例訪問一個數(shù)據(jù)庫,但是一個實(shí)例一次只能訪問一個數(shù)據(jù)庫。
實(shí)例是一個臨時性的東西,你也可以認(rèn)為它代表了數(shù)據(jù)庫某一時刻的狀態(tài)!
數(shù)據(jù)庫 = 重做文件 + 控制文件 + 數(shù)據(jù)文件 + 臨時文件
數(shù)據(jù)庫是永久的,是一個文件的集合。
ORACLE實(shí)例和數(shù)據(jù)庫之間的關(guān)系
1.
臨時性和永久性
2.
實(shí)例可以在沒有數(shù)據(jù)文件的情況下單獨(dú)啟動 startup nomount , 通常沒什么意義
3.
一個實(shí)例在其生存期內(nèi)只能裝載(alter database mount)和打開(alter database open)一個數(shù)據(jù)庫
4.
一個數(shù)據(jù)庫可被許多實(shí)例同時裝載和打開(即RAC),RAC環(huán)境中實(shí)例的作用能夠得到充分的體現(xiàn)!
下面對實(shí)例和數(shù)據(jù)庫做詳細(xì)的詮釋:
在 Oracle 領(lǐng)域中有兩個詞很容易混淆,這就是“實(shí)例”( instance )和“數(shù)據(jù)庫”( database )。作為 Oracle 術(shù)語,這兩個詞的定義如下:
q
數(shù)據(jù)庫 ( database ):物理操作系統(tǒng)文件或 磁盤 ( disk )的集合。使用 Oracle 10 g 的自動存儲管理( Automatic Storage Management , ASM )或 RAW 分區(qū)時,數(shù)據(jù)庫可能不作為操作系統(tǒng)中單獨(dú)的文件,但定義仍然不變。
q
實(shí)例 ( instance ):一組 Oracle 后臺進(jìn)程 / 線程以及一個共享內(nèi)存區(qū),這些內(nèi)存由同一個計(jì)算機(jī)上運(yùn)行的線程 / 進(jìn)程所共享。這里可以維護(hù)易失的、非持久性內(nèi)容(有些可以刷新輸出到磁盤)。就算沒有磁盤存儲,數(shù)據(jù)庫實(shí)例也能存在。也許實(shí)例不能算是世界上最有用的事物,不過你完全可以把它想成是最有用的事物,這有助于對 實(shí)例 和 數(shù)據(jù)庫 劃清界線。
這兩個詞有時可互換使用,不過二者的概念完全不同。實(shí)例和數(shù)據(jù)庫之間的關(guān)系是:數(shù)據(jù)庫可以由多個實(shí)例 裝載 和 打開 ,而實(shí)例可以在任何時間點(diǎn) 裝載 和 打開 一個數(shù)據(jù)庫。實(shí)際上,準(zhǔn)確地講,實(shí)例在其整個生存期中最多能裝載和打開一個數(shù)據(jù)庫!稍后就會介紹這樣的一個例子。
是不是更糊涂了?我們還會做進(jìn)一步的解釋,應(yīng)該能幫助你搞清楚這些概念。實(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ò)縮性極好的解決方案。
下面來看一個簡單的例子。假設(shè)我們剛安裝了 Oracle 10 g 10.1.0.3 。我們執(zhí)行一個純軟件安裝,不包括初始的“啟動”數(shù)據(jù)庫,除了軟件以外什么都沒有。
通過 pwd 命令可以知道當(dāng)前的工作目錄(這個例子使用一個 Linux 平臺的計(jì)算機(jī))。我們的當(dāng)前目錄是 dbs (如果在 Windows 平臺上,則是 database 目錄)。執(zhí)行 ls – l 命令顯示出這個目錄為“空”。其中沒有 init.ora? 文件,也沒有任何 存儲參數(shù)文件 ( stored parameter file , SPFILE );存儲參數(shù)文件將在第 3 章詳細(xì)討論。
使用 ps (進(jìn)程 狀 態(tài))命令,可以看到用戶 ora10g 運(yùn)行的所有進(jìn)程,這里假設(shè) ora10g 是 Oracle 軟件的所有者。此時還沒有任何 Oracle 數(shù)據(jù)庫進(jìn)程。
然后使用 ipcs 命令,這個 UNIX 命令可用于顯示進(jìn)程間的通信設(shè)備,如共享內(nèi)存、信號量 等。目前系統(tǒng)中沒有使用任何通信設(shè)備。
然后啟動 SQL*Plus ( Oracle 的命令行界面),并作為 SYSDBA 連接( SYSDBA 賬戶可以在數(shù)據(jù)庫中做任何事情)。連接成功后, SQL*Plus 報(bào)告稱我們連上了一個空閑的實(shí)例:
我們的“實(shí)例”現(xiàn)在只包括一個 Oracle 服務(wù)器進(jìn)程,見以下輸出中粗體顯示的部分。此時還沒有分配共享內(nèi)存,也沒有其他進(jìn)程。
現(xiàn)在來啟動實(shí)例:
這里提示的文件就是啟動實(shí)例時必須要有的一個文件,我們需要有一個參數(shù)文件(一種簡單的平面文件,后面 還 會詳細(xì)說明),或者要有一個存儲參數(shù)文件 。現(xiàn)在就來創(chuàng)建參數(shù)文件,并放入啟動數(shù)據(jù)庫實(shí)例所需的最少信息(通常還會指定更多的參數(shù),如數(shù)據(jù)庫塊大小、控制文件位置,等等)。
然后再回到 SQL*Plus :
這里對 startup 命令加了 nomount 選項(xiàng),因?yàn)槲覀儸F(xiàn)在還不想真正“裝載”數(shù)據(jù)庫(要了解啟動和關(guān)閉的所有選項(xiàng),請參見 SQL*Plus 文檔)。
注意
在 Windows 上運(yùn)行 startup 命令之前 , 還需要使用 oradim.exe 實(shí)用程序執(zhí)行一條服務(wù)創(chuàng)建語句。
現(xiàn)在就有了所謂的“實(shí)例”。運(yùn)行數(shù)據(jù)庫所需的后臺進(jìn)程都有了,如進(jìn)程監(jiān)視器( process monitor , PMON )、日志寫入器( log writer , LGWR )等,這些進(jìn)程將在第 5 章詳細(xì)介紹。
再使用 ipcs 命令,它會首次報(bào)告指出使用了共享內(nèi)存和信號量,這是 UNIX 上的兩個重要的進(jìn)程間通信設(shè)備:
注意,我們還沒有“數(shù)據(jù)庫”呢!此時,只有數(shù)據(jù)庫之名(在所創(chuàng)建的參數(shù)文件中),而沒有數(shù)據(jù)庫之實(shí)。如果試圖“裝載”這個數(shù)據(jù)庫,就會失敗,因?yàn)閿?shù)據(jù)庫根本就不存在。下面就來創(chuàng)建數(shù)據(jù)庫。有人說創(chuàng)建一個 Oracle 數(shù)據(jù)庫步驟很繁瑣,真是這樣嗎?我們來看看:
這里創(chuàng)建數(shù)據(jù)庫就是這么簡單。但在實(shí)際中,也許要使用一個稍有些復(fù)雜的 CREATE DATABASE 命令,因?yàn)榭赡苄枰嬖V Oracle 把日志文件、數(shù)據(jù)文件、控制文件等放在哪里。不過,我們現(xiàn)在已經(jīng)有了一個完全可操作的數(shù)據(jù)庫了。可能還需要運(yùn)行 $ORACLE_HOME/rdbms/admin/ catalog.sql 腳本和其他編錄腳本( catalog script )來建立我們每天使用的數(shù)據(jù)字典(這個數(shù)據(jù)庫中還沒有我們使用的某些視圖,如 ALL_OBJECTS ),但不管怎么說,數(shù)據(jù)庫已經(jīng)有了。可以簡單地查詢一些 Oracle V$ 視圖(具體就是 V$DATAFILE 、 V$LOGFILE 和 V$CONTROLFILE ),列出構(gòu)成這個數(shù)據(jù)庫的文件:
Oracle 使用默認(rèn)設(shè)置,把所有內(nèi)容都放在一起,并把數(shù)據(jù)庫創(chuàng)建為一組持久的文件。如果關(guān)閉這個數(shù)據(jù)庫,再試圖打開,就會發(fā)現(xiàn)數(shù)據(jù)庫無法打開:
一個實(shí)例在其生存期中最多只能裝載和打開一個數(shù)據(jù)庫。要想再打開這個(或其他)數(shù)據(jù)庫,必須先丟棄這個實(shí)例,并創(chuàng)建一個新的實(shí)例。
重申一遍:
q
實(shí)例 是一組后臺進(jìn)程和共享內(nèi)存。
q
數(shù)據(jù)庫 是磁盤上存儲的數(shù)據(jù)集合。
q
實(shí)例“一生”只能裝載并打開一個數(shù)據(jù)庫。
q
數(shù)據(jù)庫可以由一個或多個實(shí)例(使用 RAC )裝載和打開。
前面提到過,大多數(shù)情況下,實(shí)例和數(shù)據(jù)庫之間存在一種一對一的關(guān)系。可能正因如此,才導(dǎo)致人們很容易將二者混淆。從大多數(shù)人的經(jīng)驗(yàn)看來,數(shù)據(jù)庫就是實(shí)例,實(shí)例就是數(shù)據(jù)庫。
不過,在許多測試環(huán)境中,情況并非如此。在我的磁盤上,可以有 5 個不同的數(shù)據(jù)庫。測試主機(jī)上任意時間點(diǎn)只會運(yùn)行一個 Oracle 實(shí)例,但是它訪問的數(shù)據(jù)庫每天都可能不同(甚至每小時都不同),這取決于我的需求。只需有不同的配置文件,我就能裝載并打開其中任意一個數(shù)據(jù)庫。在這種情況下,任何時刻我都只有一個“實(shí)例”,但有多個數(shù)據(jù)庫,在任意時間點(diǎn)上只能訪問其中的一個數(shù)據(jù)庫。
所以,你現(xiàn)在應(yīng)該知道,如果有人談到實(shí)例,他指的就是 Oracle 的進(jìn)程和內(nèi)存。提到數(shù)據(jù)庫時,則是說保存數(shù)據(jù)的物理文件。可以從多個實(shí)例訪問一個數(shù)據(jù)庫,但是一個實(shí)例一次只能訪問一個數(shù)據(jù)庫。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
