一個資料庫伺服器上可以裝幾個資料庫它們都是用sid來標誌,例如orcl1,orcl2,orcl3等等,一個資料庫如orcl1中可以有多個執行個體嗎。 Oracle資料庫,實際上應該是說,我們使用的是Oracle服務server。 Oracle服務server包括有兩個部分:
一個部分是Oracle資料庫database
一個部分是資料庫執行個體instance。
Oracle資料庫database,包括有資料檔案、控制檔案、重做記錄檔,都是一些物理上的檔案。
資料庫執行個體instance,包括有資料庫後台進程(PMON、SMON、DBWR、LGWR、CKPT等)和記憶體地區SGA(包括shared pool、db buffer cache、redo log buffer等)。執行個體是一系列複雜的記憶體結構和作業系統進程
嚴格的說:一個Oracle服務,只包括一個Oracle執行個體和一個資料庫(不考慮雙機並行等這樣的情況)。但是一個執行個體只能對應一個資料庫,一個資料庫有可能對應多個執行個體。除非使用並行O r a c l e伺服器選項,否則每個O r a c l e資料庫都有一個執行個體與之相關,一個資料庫被唯一的一個執行個體裝載。 資料庫與執行個體之間是1對1/n的關係,在非並行的資料庫系統中每個Oracle資料庫與一個執行個體相對應;在並行的資料庫系統中,一個資料庫會對應多個執行個體,同一時間使用者只與一個執行個體相聯絡,當某一個執行個體出現故障時,其他執行個體自動服務,保證資料庫正常運行。在任何情況下,每個執行個體都只可以對應一個資料庫。 在實際的開發應用中,關於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。