一、通俗解釋
首先說說,數據庫是做什么?
數據庫是用來長久存儲數據的,而我們大家都知道內存只能臨時存儲,磁盤等才能真正存儲數據。
那數據庫會放那里呢?肯定是存放在磁盤上,其實數據庫就是磁盤上的一個文件。
從上面我們得出結論:數據庫==磁盤上的文件。
既然數據庫可以看成磁盤上文件,我們怎么使用數據庫呢?
如果說我們可以直接使用數據庫,那就等價與直接使用磁盤上的文件。
我們知道這樣的一個常識:必須把磁盤上的文件讀入內存才能使用.這就與我們以前所知道的一個常識相違背了。
那正確的流程是不是應該這樣呢?把磁盤上文件先讀入內存,然后再使用呢。
對了,這個才是使用數據庫的正確流程。
數據庫如何讀入內存呢?
這個時候,就是我們要介紹的instance(實例)了.實例就是內存結構和一組后台進程.
實際上,正常的數據庫讀入內存的過程是,由實例中一組后台進程從磁盤上將數據文件讀入到實例的內存中,然后經過在內存中對數據的操作再從實例的內存中經過一組后台進程寫到數據庫中.
那實例相對與數據庫而言,應該就是數據庫的運行環境(隨不准確但也很貼切).
二、專業解釋
實例是“內存”和“后台進程”的集合。數據庫是數據的物理存儲。特別注意,一個實例可以用於一個數據庫,多個實例也可以同時用於一個數據庫,實例和數據庫的關系是一對多的關系。
舉個例子,如果把數據庫比作一架飛機,實例就是飛機的發動機。那么,一台發動機可以驅動飛機,兩台發動機也可以同時驅動一架飛機。
多個“實例”同時驅動一個“數據庫”的架構叫“集群(Oracle real application clusters,簡稱RAC)”,這是Oracle的一種高端應用,如果結合磁盤陣列的保護機制,RAC能最大限度的保護我們的應用不間斷運行,數據不丟失。
什么是數據庫,其實很簡單,數據庫就是存儲數據的一種媒介。比如常用的文件就是一種,在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。
三、Oracle
什么是oracle? 平常所說的 Oracle 或 Oracle 數據庫指的是 Oracle 數據庫管理系統. Oracle 數據庫管理系統是管理數據庫訪問的計算機軟件(Oracle database manager system). 它由 Oracle 數據庫和 Oracle 實例(instance)構成(區別mysql,mysql沒有實例的概念)
Oracle 實例: 位於物理內存里的數據結構,它由操作系統的多個后台進程和一個共享的內存池所組成,共享的內存池可以被所有進程訪問.Oracle 用它們來管理數據庫訪問.用戶如果要存取數據庫(也就是硬盤上的文件) 里的數據, 必須通過Oracle實例才能實現, 不能直接讀取硬盤上的文件.實際上, Oracle 實例就是平常所說的數據庫服務(service) .在任何時刻一個實例只能與一個數據庫關聯,訪問一個數據庫;而同一個數據庫可由多個實例訪問(RAC)
1、一個Oracle數據庫系統中可以同時安裝幾個數據庫,每一個數據庫對應一個唯一的實例,但是OPS系統除外,可以多個實例同時對一個數據庫操作,稱為並行服務器
2、只是一個名字,SID即是INSTANCE_NAME,SERVICE_NAMES主要用在監聽器中,service_names是對外的服務名,是服務器端使用的,一個庫可以設置多個對外服務名。比如你身份證叫王大錘,這個就是SID,但是對外不同圈子你有很多外號,蛋蛋,二狗子,這些對外的稱呼就是SERVICE_NAME.
3、NET EASY CONFIG操縱的應該是主機字符串,是為客戶端服務的,
一個數據庫可以對外公布多個服務名(SERVICE_NAMES)
一個客戶端也可以用多個主機字符串連接到同一個數據庫服務器上
4、一個OS上可以裝多個Oracle數據庫(小的概念),每個庫可以對外公布多個服務名,都通過init.ora和listener.ora來實現
注意:在mysql中數據庫與數據庫實例是一對一之間的關系,區別於oracle一對多的概念。