Oracle中實例(Instance)和數據庫(database)的區別

在實際的開發應用中,關於Oracle數據庫,經常聽見有人說建立一個數據庫,建立一個Instance,啓動一個Instance之類的話。其實問他們什麼是數據庫,什麼是Instance,很可能他們給的答案就是數據庫就是Instance,Instance就是數據庫啊,沒有什麼區別。在這裏,只能說雖然他們Oracle用了可能有了一定的經驗,不過基礎的概念還是不太清楚。

什麼是數據庫,其實很簡單,數據庫就是存儲數據的一種媒介。比如常用的文件就是一種,在Oracle10G中,數據的存儲有好幾種。第一種是文件形式,也就是在你的磁盤中創建一批文件,然後在這些文件中存儲信息。第二種就是磁盤陣列形式,這個是什麼意思呢,這個就是說明數據庫不是存放爲某個文件,而是把一個或者多個磁盤格式化成Oracle的一種格式了,等於整個磁盤就是存放Oracle數據庫的,不能作爲別的用途。這樣的優點是存儲性能高,因爲不再借助別的文件格式了,而是把整個磁盤都成爲Oracle最適應的文件系統格式。當然還可能有別的形式,比如網絡什麼的。不過我們最常用的還是文件格式的,在文件格式中,數據庫指的就是那些數據文件,控制文件以及REDO文件等等一系列文件。

而什麼是Instance呢,Instance其實就是指的操作系統中一系列的進程以及爲這些進程所分配的內存塊。在Oracle中,我們可以新建一個Oracle的Instance,這個時候雖然有了進程還有SGA等一系列的內存塊,但是這個時候並沒有把數據庫文件讀取進來。所以只是一個實例,在後來,你可以通過命令手動或者自動地把數據庫文件加載進我們的數據庫Instance中,這個時候的數據庫纔可以讓我們真正的開始訪問操作。

所以說,假如想實現數據庫的應用,數據庫和數據庫Instance是缺一不可的。假如只有數據庫的那些文件,那麼,只能代表數據在這個文件中,但是我們無法直接進行操作。而假如只有數據庫Instance,那麼我們雖然可以即興操作,但是也不知道操作哪些數據,操作生成的數據也無法保存等等。所以,當一個Oracle Instance真正Load了一個Oracle Database了以後,數據庫纔可以被我們使用。

在這裏要注重一點的是,Oracle的實例在啓動以後,只能load一次數據庫,假如想把數據庫與Instance斷開,然後再重新掛在一個數據庫Instance,那麼就需要你首先把數據庫Instance進程結束,然後重新建立這個instance的一個進程,再load另外一個數據庫。否則肯定要拋除ORA-16169錯誤,說數據庫已經被打開。因爲一個數據庫Instance在其生存期中最多隻能load和打開一個instance.

1、實例和SID的關係是什麼?
經常有人問SID 是什麼?在Oracle 系統中SID 是一個經常出現的變量,如環境變量ORACLE_SID,初始化文件initSID.ora,那究竟什麼是SID 呢?其實SID 就是Oracle 實例的標識,不同的SID 對應不同的內存緩衝(SGA)和不同的後臺進程。這樣一來我們就可以得當在一臺物理的服務器上可以有多個SID 的數據庫實例。
2、Oracle數據庫和實例的關係是什麼?
數據庫是由物理文件和存取數據文件的實例組成,當存取數據文件的實例是一個的時候,數據庫被稱做單節點數據庫。這是我們看到的最多的數據庫形式。當然還有一種多節點數據庫,就是一個以上的實例共同訪問一個數據庫(或者說共同訪問一組數據文件),更好的提供穩定性和並行處理能力。這在8i中被稱爲OPS(Oracle Parallel Server ),在Oracle9i 中被稱爲RAC(real application cluster)。在這種數據庫中。兩個/多個實例分別在不同服務器上,所有Oracle 數據文件在共享的磁盤陣列上,多個服務器上的實例可以同時工作,他們通過一個內部的網絡進行通信。如果一臺服務器不能提供服務的話,另一臺會接管它的工作,特別是在關鍵的業務有很大的潛力。
這裏,我們瞭解了實例和數據庫的關係,一個數據庫可以有多個實例,但是一個實例卻不可能對應多個數據庫,在一般的情況下,我們都是用的單節點數據庫,即一個實例僅僅對應一個數據庫。

好多人學了很長時間的數據庫了,但實例(例程)和數據庫經常搞昏.這個可能是學院教育的後遺症吧.
首先說說,數據庫是做什麼?數據庫是用來長久存儲數據的,而我們大家都知道內存只能臨時存儲,磁盤等才能真正存儲數據.那你說數據庫會放那裏呢?肯定是存放在磁盤上,其實數據庫就是磁盤上的一個文件.
從上面我們得出結論:數據庫==磁盤上的文件.
既然數據庫可以看成磁盤上文件,我們怎麼使用數據庫呢?
如果說我們可以直接使用數據庫,那就等價與直接使用磁盤上的文件.我們知道這樣的一個常識:必須把磁盤上的文件讀入內存才能使用.這就與我們以前所知道的一個常識相違背了。那正確的流程是不是應該這樣呢?把磁盤上文件先讀入內存,然後再使用呢。對了,這個纔是使用數據庫的正確流程。

數據庫如何讀入內存呢?
這個時候,就是我們要介紹的instance(實例)了.實例就是內存結構和一組後臺進程.實際上,正常的數據庫讀入內存的過程是,由實例中一組後臺進程從磁盤上將數據文件讀入到實例的內存中,然後經過在內存中對數據的操作再從實例的內存中經過一組後臺進程寫到數據庫中.
那實例相對與數據庫而言,應該就是數據庫的運行環境(隨不準確但也很貼切).
我們知道了instance和database的區別後.下面我們做一個Oracle的例子,一塊深刻的理解下這兩個概念.在Oracle中打開一個數據庫,這個時候我們要使用sqlplus了.sqlplus是oracle的一個連接工具,相當於sql server中的查詢分析器.
使用用戶名:system
密碼:manger(自己在裝Oracle時設定的)
點登錄進入sqlplus.
登錄sqlplus以後,system這個用戶是沒有權限啓動實例的,所以我們這時要更換登錄用戶.
使用sys用戶連接的命令如下 :
conn sys as dba
密碼:
輸入完後.可以再輸入如下命令查看當前用戶:
show user;
一:下面就可以打開數據庫了
1.啓動實例(instance)
startup nomount
2.將數據庫裝載到實例(instance)中
alter database mount
3.打開數據庫
alter database open
二:關閉數據庫:
1.shutdown immediate(包括三個步驟如下所述:)
首先關閉數據庫
然後從實例上卸載數據庫
最後關閉實例
通過Oracle打開以及關閉一個數據庫的例子我們可以清楚的區分.數據庫(database)和實例(instance)的概念.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章