oracle例項和資料庫的區別

lurou發表於2011-08-31

轉載一篇經典文章,這篇文章在電腦裡放了很長時間了,作者不都記得了,真是很慚愧。講解是我見到的講的最清楚的,謝謝原創者。缺點是原文的圖片已經看不到了,只剩下文字了。看看也行的


===========================================

剛接觸ORACLE的人肯定會對例項和資料庫感到困惑,例項到底代表些什麼?為什麼會有這個概念的出現?

ORACLE例項 = 程式 + 程式所使用的記憶體(SGA)

例項是一個臨時性的東西,你也可以認為它代表了資料庫某一時刻的狀態!

資料庫 = 重做檔案 + 控制檔案 + 資料檔案 + 臨時檔案

資料庫是永久的,是一個檔案的集合。

ORACLE例項和資料庫之間的關係

1.

臨時性和永久性

2.

例項可以在沒有資料檔案的情況下單獨啟動 startup nomount , 通常沒什麼意義

3.

一個例項在其生存期內只能裝載(alter database mount)和開啟(alter database open)一個資料庫

4.

一個資料庫可被許多例項同時裝載和開啟(即RAC),RAC環境中例項的作用能夠得到充分的體現!

下面對例項和資料庫做詳細的詮釋:

在Oracle領域中有兩個詞很容易混淆,這就是“例項”(instance)和“資料庫”(database)。作為Oracle術語,這兩個詞的定義如下:

資料庫(database):物理作業系統檔案或磁碟(disk)的集合。使用Oracle 10g的自動儲存管理(Automatic Storage Management,ASM)或RAW分割槽時,資料庫可能不作為作業系統中單獨的檔案,但定義仍然不變。

例項(instance):一組Oracle後臺程式/執行緒以及一個共享記憶體區,這些記憶體由同一個計算機上執行的執行緒/程式所共享。這裡可以維護易失的、非永續性內容(有些可以重新整理輸出到磁碟)。就算沒有磁碟儲存,資料庫例項也能存在。也許例項不能算是世界上最有用的事物,不過你完全可以把它想成是最有用的事物,這有助於對例項和資料庫劃清界線。

這兩個詞有時可互換使用,不過二者的概念完全不同。例項和資料庫之間的關係是:資料庫可以由多個例項裝載和開啟,而例項可以在任何時間點裝載和開啟一個資料庫。實際上,準確地講,例項在其整個生存期中最多能裝載和開啟一個資料庫!稍後就會介紹這樣的一個例子。

是不是更糊塗了?我們還會做進一步的解釋,應該能幫助你搞清楚這些概念。例項就是一組作業系統程式(或者是一個多執行緒的程式)以及一些記憶體。這些程式可以運算元據庫;而資料庫只是一個檔案集合(包括資料檔案、臨時檔案、重做日誌檔案和控制檔案)。在任何時刻,一個例項只能有一組相關的檔案(與一個資料庫關聯)。大多數情況下,反過來也成立:一個資料庫上只有一個例項對其進行操作。不過,Oracle的真正應用叢集(Real Application Clusters,RAC)是一個例外,這是Oracle提供的一個選項,允許在叢集環境中的多臺計算機上操作,這樣就可以有多臺例項同時裝載並開啟一個資料庫(位於一組共享物理磁碟上)。由此,我們可以同時從多臺不同的計算機訪問這個資料庫。Oracle RAC能支援高度可用的系統,可用於構建可擴縮性極好的解決方案。

下面來看一個簡單的例子。假設我們剛安裝了Oracle 10g10.1.0.3。我們執行一個純軟體安裝,不包括初始的“啟動”資料庫,除了軟體以外什麼都沒有。

透過pwd命令可以知道當前的工作目錄(這個例子使用一個Linux平臺的計算機)。我們的當前目錄是dbs(如果在Windows平臺上,則是database目錄)。執行ls–l命令顯示出這個目錄為“空”。其中沒有init.ora 檔案,也沒有任何儲存引數檔案(stored parameter file,SPFILE);儲存引數檔案將在第3章詳細討論。

使用ps(程式狀態)命令,可以看到使用者ora10g執行的所有程式,這裡假設ora10g是Oracle軟體的所有者。此時還沒有任何Oracle資料庫程式。

然後使用ipcs命令,這個UNIX命令可用於顯示程式間的通訊裝置,如共享記憶體、訊號量等。目前系統中沒有使用任何通訊裝置。

然後啟動SQL*Plus(Oracle的命令列介面),並作為SYSDBA連線(SYSDBA賬戶可以在資料庫中做任何事情)。連線成功後,SQL*Plus報告稱我們連上了一個空閒的例項:

我們的“例項”現在只包括一個Oracle伺服器程式,見以下輸出中粗體顯示的部分。此時還沒有分配共享記憶體,也沒有其他程式。

現在來啟動例項:

這裡提示的檔案就是啟動例項時必須要有的一個檔案,我們需要有一個引數檔案(一種簡單的平面檔案,後面還會詳細說明),或者要有一個儲存引數檔案。現在就來建立引數檔案,並放入啟動資料庫例項所需的最少資訊(通常還會指定更多的引數,如資料庫塊大小、控制檔案位置,等等)。

然後再回到SQL*Plus:

這裡對startup命令加了nomount選項,因為我們現在還不想真正“裝載”資料庫(要了解啟動和關閉的所有選項,請參見SQL*Plus文件)。

注意

在Windows上執行startup命令之前,還需要使用oradim.exe實用程式執行一條服務建立語句。

現在就有了所謂的“例項”。執行資料庫所需的後臺程式都有了,如程式監視器(process monitor,PMON)、日誌寫入器(log writer,LGWR)等,這些程式將在第5章詳細介紹。

再使用ipcs命令,它會首次報告指出使用了共享記憶體和訊號量,這是UNIX上的兩個重要的程式間通訊裝置:

注意,我們還沒有“資料庫”呢!此時,只有資料庫之名(在所建立的引數檔案中),而沒有資料庫之實。如果試圖“裝載”這個資料庫,就會失敗,因為資料庫根本就不存在。下面就來建立資料庫。有人說建立一個Oracle資料庫步驟很繁瑣,真是這樣嗎?我們來看看:

這裡建立資料庫就是這麼簡單。但在實際中,也許要使用一個稍有些複雜的CREATE DATABASE命令,因為可能需要告訴Oracle把日誌檔案、資料檔案、控制檔案等放在哪裡。不過,我們現在已經有了一個完全可操作的資料庫了。可能還需要執行$ORACLE_HOME/rdbms/admin/ catalog.sql指令碼和其他編錄指令碼(catalog script)來建立我們每天使用的資料字典(這個資料庫中還沒有我們使用的某些檢視,如ALL_OBJECTS),但不管怎麼說,資料庫已經有了。可以簡單地查詢一些Oracle V$檢視(具體就是V$DATAFILE、V$LOGFILE和V$CONTROLFILE),列出構成這個資料庫的檔案:

Oracle使用預設設定,把所有內容都放在一起,並把資料庫建立為一組持久的檔案。如果關閉這個資料庫,再試圖開啟,就會發現資料庫無法開啟:

一個例項在其生存期中最多隻能裝載和開啟一個資料庫。要想再開啟這個(或其他)資料庫,必須先丟棄這個例項,並建立一個新的例項。

重申一遍:

例項是一組後臺程式和共享記憶體。

資料庫是磁碟上儲存的資料集合。

例項“一生”只能裝載並開啟一個資料庫。

資料庫可以由一個或多個例項(使用RAC)裝載和開啟。

前面提到過,大多數情況下,例項和資料庫之間存在一種一對一的關係。可能正因如此,才導致人們很容易將二者混淆。從大多數人的經驗看來,資料庫就是例項,例項就是資料庫。

不過,在許多測試環境中,情況並非如此。在我的磁碟上,可以有5個不同的資料庫。測試主機上任意時間點只會執行一個Oracle例項,但是它訪問的資料庫每天都可能不同(甚至每小時都不同),這取決於我的需求。只需有不同的配置檔案,我就能裝載並開啟其中任意一個資料庫。在這種情況下,任何時刻我都只有一個“例項”,但有多個資料庫,在任意時間點上只能訪問其中的一個資料庫。

所以,你現在應該知道,如果有人談到例項,他指的就是Oracle的程式和記憶體。提到資料庫時,則是說儲存資料的物理檔案。可以從多個例項訪問一個資料庫,但是一個例項一次只能訪問一個資料庫。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26006637/viewspace-706344/,如需轉載,請註明出處,否則將追究法律責任。

相關文章