對於剛接觸Oracle,尤其是以前有MS SQL server經驗的的人來說,最迷惑的恐怕就是database和instance這兩個詞了。
其實這兩個概念理解起來相當簡單。讓我們舉個例子:
notepad記事本,相信大家都很熟悉。那麼,位於windows目錄下的notepad.exe,是一個軟體,對吧。我們雙擊notepad.exe(或者從命令列啟動,這都不是問題),然後記憶體中就有notepad的一個執行執行個體了,這個執行個體只存在於記憶體中,一旦電腦關機重啟,執行個體就不再存在了。
再假設我們硬碟上有一個文字檔test.txt,這個檔案是在硬碟上物理存在的,不管電腦是否關閉,他都存在。然後我們用執行的notepad開打這個test.txt,我們就將一個notepad執行個體和一個物理的文字檔關聯起來了,test.txt被讀入記憶體(緩衝),在notepad執行個體中對這個test.txt檔案進行編輯操作。
oracle雖然比notepad龐大複雜許多,但是基本原理也是一樣的。我們安裝完oracle伺服器軟體,就在硬碟上有了一個oracle的可執行程式,就像notepad.exe。我們啟動oracle的一個instance,就好像啟動一個notepad的執行個體,這個執行個體完全存在於記憶體中(當然,也可以由於記憶體不夠而被swap到硬碟的pagafile上),notepad的執行個體只有一個進程(線程),而複雜的oracle就有很多的進程(線程),這些進程(線程)就叫做background process,同時oracle由於要操作比較多的資料,所以就要划出一塊比較大的記憶體給他用,這塊記憶體的名字叫做SGA。然後oracle的instance開啟一組檔案,就像notepad執行個體開啟test.txt,oracle給這組檔案起了一個專門的名字:database
其實,軟體也好,執行個體也好,檔案也好,出現這些概念和區別,我想,最主要還是因為電腦的結構特性:記憶體速度快,但是掉電後丟失內容;硬碟速度慢,但是內容永久存在。這個特性決定了所有的電腦軟體的行為:為了儘可能的快,程式要在記憶體中運行,資料要在記憶體中緩衝;為了永久儲存,程式和資料要儲存在硬碟中。
在記憶體中啟動並執行程式和儲存該程式的資料的緩衝,我們稱之為instance;在硬碟上保留的程式,我們稱之為軟體,在硬碟上保留的資料,我們稱之為檔案。對於oracle,需要一組檔案,別且要保持一定的一致性和完整性,這組檔案統一有個名字叫database。
相關資料字典:v$instance v$database
注意到
v$instance.instance_name varchar2(16)
v$database.name varchar2(9)
所以instance和database的名字長度都有限制的。使用DBCA的時候,不輸入資料庫和SID名的話,提示:資料庫名必須1到8個字元,SID必須1到64個字母數字字元。但我在xp上實驗10gR2,手工建立名字超過15個字元的instance,可以成功並且能夠startup,但是查詢v$instance裡面的instance_name欄位為空白,15個字元之內(包括15個)則正常。建議是:instance名不超過15個字元,database名不超過8個字元。一般情況下,最好保持instance名和database名一致。