Enterprise Edition Enterprise Edition
Standard Edition Standard Edition
Workgroup Edition Standard Edition One
Express edition Express Edition
Web Edition
Compact Edition X
Developer Edition Enterprise Edition
top實(shí)例、數(shù)據(jù)庫和表空間
SQL Server和Oracle之間第一個(gè)架構(gòu)級別的差異就在于對實(shí)例 (instance)和數(shù)據(jù)庫(database)概念的定義了。
SQL Server中,實(shí)例一詞用來代表一個(gè)包含了操作系統(tǒng)文件、內(nèi)存結(jié)構(gòu)、后臺進(jìn)程以及注冊表信息的獨(dú)立的應(yīng)用服務(wù)。在Windows系統(tǒng)中用一個(gè)存在著停止和運(yùn)行狀態(tài)的服務(wù)來代表一個(gè)實(shí)例,當(dāng)處于運(yùn)行狀態(tài)時(shí),實(shí)例要占用一定的服務(wù)器內(nèi)存以及生成一定數(shù)量的后臺進(jìn)程。
SQL Server實(shí)例的中心是數(shù)據(jù)庫。一個(gè)SQL Server數(shù)據(jù)庫指的是一個(gè)資料庫以及操作數(shù)據(jù)所需要的程序代碼,當(dāng)實(shí)例沒有運(yùn)行時(shí),實(shí)例中的數(shù)據(jù)庫就不能夠訪問。
SQL Server有兩種數(shù)據(jù)庫:系統(tǒng)數(shù)據(jù)庫(system databases)和用戶數(shù)據(jù)庫(user databases)。在一個(gè)SQL Server實(shí)例安裝完成之后,將會自動創(chuàng)建5個(gè)系統(tǒng)數(shù)據(jù)庫:master, model, msdb, tempdb和resource。如果一個(gè)機(jī)器上面安裝了多個(gè)SQL Server實(shí)例時(shí),沒有實(shí)例都會有自己單獨(dú)的一套系統(tǒng)數(shù)據(jù)庫。除了msdb數(shù)據(jù)庫之外,其它數(shù)據(jù)庫不能訪問或是被損壞都會導(dǎo)致實(shí)例無法啟動。相比之下用戶數(shù)據(jù)庫由DBA或者是開發(fā)人員在數(shù)據(jù)庫實(shí)例安裝完畢、系統(tǒng)數(shù)據(jù)庫都啟動之后所創(chuàng)建的,這些數(shù)據(jù)庫中保存著公司的業(yè)務(wù)資料。
簡而言之,一個(gè)SQL Server實(shí)例總是要包含一些數(shù)據(jù)庫(盡管有時(shí)只是那些系統(tǒng)數(shù)據(jù)庫),一個(gè)數(shù)據(jù)庫也總是要有一個(gè)(且僅有一個(gè))與之關(guān)聯(lián)的實(shí)例。
從物理角度說,一個(gè)SQL Server數(shù)據(jù)庫表現(xiàn)為存儲于磁盤上面的一組操作系統(tǒng)文件的集合。數(shù)據(jù)庫文件分為兩種:數(shù)據(jù)文件 (data file)和事務(wù)日志文件(transaction log file)。一個(gè)數(shù)據(jù)庫至少要包含一個(gè)數(shù)據(jù)文件和一個(gè)事務(wù)日志文件,SQL Server數(shù)據(jù)庫的資料主要是存在于數(shù)據(jù)文件中,事務(wù)日志文件用來記錄發(fā)生在這些數(shù)據(jù)上面的變更記錄,SQL Server在執(zhí)行系統(tǒng)恢復(fù)的時(shí)候要用到它。一個(gè)數(shù)據(jù)文件或事務(wù)日志文件只能隸屬于一個(gè)特定的數(shù)據(jù)庫,不存在兩個(gè)數(shù)據(jù)庫共用一個(gè)數(shù)據(jù)文件或者是日志文件的情況。一個(gè)數(shù)據(jù)量很大的數(shù)據(jù)庫可以使用多個(gè)數(shù)據(jù)文件,這些數(shù)據(jù)文件能夠被邏輯的組合成一個(gè)稱為文件組(file group)的邏輯組。
在Oracle中,這一切看起來都有點(diǎn)反著來了。當(dāng)Oracle啟動時(shí),它和SQL Server一樣要先占用一些服務(wù)器內(nèi)存用于執(zhí)行操作,這個(gè)內(nèi)存區(qū)域——著名的SGA(System Global Area)—— 被分為數(shù)個(gè)不同的結(jié)構(gòu),在創(chuàng)建SGA的同時(shí)也會啟動一系列的后臺進(jìn)程用于和SGA進(jìn)行交互,在這里這些分配的內(nèi)存空間和后臺進(jìn)程組合起來就是Oracle實(shí)例了。請注意現(xiàn)在我們沒有見到數(shù)據(jù)庫的影子還,實(shí)際上 Oracle實(shí)例在沒有數(shù)據(jù)庫或是數(shù)據(jù)庫不能訪問時(shí)也是跑的很好的,在安裝Oracle時(shí),我們可以選擇只安裝軟件,完了之后再安裝數(shù)據(jù)庫。
Oracle中的數(shù)據(jù)包含了一組操作系統(tǒng)文件。不像SQL Server數(shù)據(jù)庫,Oracle數(shù)據(jù)庫并不能代表數(shù)據(jù)庫對象的邏輯分組,它更像是表示包含多個(gè)存在于磁盤上的用來保存數(shù)據(jù)的文件的一個(gè)單個(gè)的集合名詞。
組成Oracle數(shù)據(jù)庫的文件可以分成三個(gè)類型:數(shù)據(jù)文件(data file)、重做日志文件(redo log file)和控制文件(control file)。數(shù)據(jù)文件保存數(shù)據(jù),Oracle中可以存在任意數(shù)量的數(shù)據(jù)文件;重做日志文件跟SQL Server的事務(wù)日志文件一樣用來保存對數(shù)據(jù)更改的記錄,在系統(tǒng)恢復(fù)階段需要用到;控制文件是一些特別的小文件,用來保存一些至關(guān)重要的關(guān)于數(shù)據(jù)庫的信息,沒有這個(gè)文件的話,實(shí)例就無法打開數(shù)據(jù)庫。
除了數(shù)據(jù)文件、重做日志文件、控制文件之外,數(shù)據(jù)庫還包含參數(shù)文件(parameter file)、密碼文件(password file)和可選的歸檔日志文件(archive log files),后面很快會對這些文件類型展開討論。
Oracle系統(tǒng)啟動時(shí),首先在內(nèi)存中創(chuàng)建數(shù)據(jù)庫實(shí)例,然后由實(shí)例找到保存在磁盤中的數(shù)據(jù)庫,最后打開數(shù)據(jù)庫讓用戶操作。當(dāng)系統(tǒng)關(guān)閉時(shí),實(shí)例會從內(nèi)存中清除掉:整個(gè)內(nèi)存結(jié)構(gòu)和后臺進(jìn)程都會消失,但是數(shù)據(jù)庫依然存在于磁盤上,只是處于關(guān)閉的狀態(tài)。之前也說過,Oracle實(shí)例可以在不打開數(shù)據(jù)庫的情況下運(yùn)行——這是與SQL Server數(shù)據(jù)庫最大的不同,SQL Server實(shí)例是不能夠離開系統(tǒng)數(shù)據(jù)庫而運(yùn)行的。不過和SQL Server一樣Oracle數(shù)據(jù)庫在實(shí)例沒有啟動的情況下也是不能訪問的。
一般來說Oracle實(shí)例和數(shù)據(jù)庫之間是一對一的關(guān)系。一個(gè)實(shí)例對應(yīng)著一個(gè)數(shù)據(jù)庫,但是一個(gè)數(shù)據(jù)庫卻可以同時(shí)由多個(gè)實(shí)例去訪問它。一個(gè)獨(dú)立的 Oracle安裝包含一個(gè)實(shí)例和一個(gè)供實(shí)例操作的數(shù)據(jù)庫,而配置成RAC(Real Application Cluster)的安裝則可以允許多個(gè)存在于不同機(jī)器上的實(shí)例訪問存在于一個(gè)共享磁盤上面的數(shù)據(jù)庫。
那Oracle中數(shù)據(jù)庫對象的邏輯分組在那兒呢?在SQL Server中邏輯分組由數(shù)據(jù)庫自己來完成,而在Oracle中,這項(xiàng)工作由表空間(tablespace)完成,Oracle表空間是用來對表、視圖、索引和其他數(shù)據(jù)庫對象進(jìn)行分組的邏輯結(jié)構(gòu)。例如,你的 Oracle產(chǎn)品庫可以給HR應(yīng)用一個(gè)單獨(dú)的表空間,支付應(yīng)用則使用另外一個(gè)。一個(gè)數(shù)據(jù)庫可以邏輯的分成若干個(gè)表空間,這些表空間在物理上則由一個(gè)或者多個(gè)數(shù)據(jù)文件組成。因此在Oracle中與SQL Server數(shù)據(jù)庫等價(jià)的是表空間。
由于這兩種結(jié)構(gòu)在功能上相當(dāng)類似,在SQL Server中建立數(shù)據(jù)庫的過程和在Oracle中建立表空間的過程也非常相似。不管是建立數(shù)據(jù)庫還是表空間,DBA都要首先指定一個(gè)名字,然后給新建的數(shù)據(jù)庫或者表空間分配一個(gè)或多個(gè)數(shù)據(jù)文件,并為每個(gè)數(shù)據(jù)文件指定初始大小和數(shù)據(jù)增長情況。
在SQL Server中可以做到讓一個(gè)用戶數(shù)據(jù)庫離線或是只讀,Oracle的用戶表空間也一樣可以。在SQL Server中可以讓一個(gè)用戶數(shù)據(jù)庫中的一個(gè)或者多個(gè)數(shù)據(jù)文件只讀,而Oracle用戶表空間中的一個(gè)或者多個(gè)數(shù)據(jù)文件也同樣能標(biāo)記為離線。
不過數(shù)據(jù)庫和表空間在某些方面還是有差別的:
* SQL Server中,數(shù)據(jù)文件可以用文件組邏輯的進(jìn)行分組,而Oracle表空間就沒有類似的概念。
* SQL Server的每個(gè)數(shù)據(jù)庫都有自己的事務(wù)日志文件,而且在創(chuàng)建數(shù)據(jù)庫的時(shí)候就要指定這些日志文件的屬性。而在Oracle中整個(gè)數(shù)據(jù)庫(意為所有的表空間)的事務(wù)日志都是記錄在同樣的一樣重做日志中,因此也不存在說給每個(gè)表空間建立一個(gè)單獨(dú)的日志文件的說法。
* SQL Server中,數(shù)據(jù)庫可以設(shè)置成簡單恢復(fù)模式(simple recovery mode),簡單恢復(fù)模式指的是活動的數(shù)據(jù)庫日志在checkpoint操作完成之后就會截?cái)?。Oracle也有類似的概念,這個(gè)稍后會說到,不過不能在表空間級別上進(jìn)行這樣的設(shè)置。
top實(shí)例名和SID
SQL Server和Oracle都允許在同一個(gè)機(jī)器上面同時(shí)運(yùn)行多個(gè)實(shí)例,多個(gè)實(shí)例的執(zhí)行環(huán)境是完全獨(dú)立的:就單個(gè)的數(shù)據(jù)庫引擎而言,它并不知道也不關(guān)心有沒有其他的實(shí)例在這個(gè)機(jī)器上運(yùn)行著。
在SQL Server中這種機(jī)制通過實(shí)例這個(gè)概念來實(shí)現(xiàn),SQL Server可以作為一個(gè)命名的(named) 或是 默認(rèn)(default) 的實(shí)例來運(yùn)行,默認(rèn)實(shí)例的名字和運(yùn)行它的Windows服務(wù)器的名字一樣,顯然一個(gè)系統(tǒng)的默認(rèn)實(shí)例只可能存在一個(gè),不過在一個(gè)機(jī)器上可以存在多個(gè)命名的實(shí)例,命令實(shí)例的名字格式為 HOSTNAMEINSTANCE_NAME ,同一個(gè)主機(jī)上每個(gè)運(yùn)行實(shí)例的 INSTANCE_NAME 必須是唯一的,每個(gè)實(shí)例都有著自己的一套程序文件以及一些與其它實(shí)例共享的通用組件。
而Oracle也差不多,在安裝Oracle的時(shí)候,DBA就需要指定一個(gè) 全局?jǐn)?shù)據(jù)庫名(Global Database Name)和系統(tǒng)標(biāo)識符 (SID, System Identifier)。Oracle中實(shí)例和數(shù)據(jù)庫是完全不同的東西,一個(gè)全局?jǐn)?shù)據(jù)庫名用來在網(wǎng)絡(luò)上唯一的識別一個(gè)數(shù)據(jù)庫的存放位置,一個(gè)完整的名字通常是下面的格式database_name.network_domain_name。 SID則是用來識別一個(gè)與數(shù)據(jù)庫關(guān)聯(lián)的實(shí)例,大都數(shù)情況下一個(gè)實(shí)例關(guān)聯(lián)一個(gè)單個(gè)的數(shù)據(jù)庫,數(shù)據(jù)庫名和SID名字會是一樣。RAC環(huán)境中就不一樣了,RAC 允許多個(gè)實(shí)例訪問放在共享存儲中的同一個(gè)數(shù)據(jù)庫,此時(shí)的實(shí)例名和數(shù)據(jù)庫名字將不一樣。當(dāng)然和SQL Server一樣,一個(gè)Oracle數(shù)據(jù)庫服務(wù)器上面是不允許兩個(gè)實(shí)例使用同一個(gè)SID的,另外一點(diǎn)類似的就是在安裝時(shí)一旦指定,不管是SQL Server實(shí)例名還是Oracle SID都是不能再修改了。
SQL Server DBA可以通過下面的語句查詢當(dāng)前登錄系統(tǒng)的實(shí)例名:
查看源代碼
打印幫助
1 SELECT @@SERVERNAME
Oracle DBA用來查詢實(shí)例名和數(shù)據(jù)名的語句如下:
查看源代碼
打印幫助
1 SELECT INSTANCE_NAME, HOST_NAME, VERSION, DATABASE_STATUS FROM V$INSTANCE;
2 SELECT NAME, DATABASE_ROLE, CREATED FROM V$DATABASE;
top系統(tǒng)數(shù)據(jù)庫和系統(tǒng)表空間
一個(gè)SQL Server實(shí)例需要有5個(gè)系統(tǒng)數(shù)據(jù)庫(2005之前的是4個(gè)):master, model, msdb, tempdb和resource,一個(gè)Oracle數(shù)據(jù)庫則最少需要3個(gè)系統(tǒng)表空間才能正常操作,它們是:SYSTEM, SYSAUX和TEMP。
master和resource數(shù)據(jù)庫集中保存了SQL Server自身管理所需要的所有信息,里面保存了諸如系統(tǒng)配置,數(shù)據(jù)庫列表和文件路徑、終結(jié)點(diǎn)、連接服務(wù)器和用戶帳戶(或“登錄”信息),系統(tǒng)級別的對象存儲在只讀的數(shù)據(jù)庫”資源(resource)”中。
在Oracle中,SYSTEM表空間等價(jià)于master數(shù)據(jù)庫,SYSTEM表空間包含了數(shù)據(jù)字典(data dictionary),也就是關(guān)于Oracle自身的元數(shù)據(jù)(metadata),這里的數(shù)據(jù)字典可以和SQL Server中的resource數(shù)據(jù)庫進(jìn)行類比。到這里你也許猜到了:如果SYSTEM不存在或是損壞了的話Oracle數(shù)據(jù)庫是打不開的。
對于一個(gè)SQL Server實(shí)例,model數(shù)據(jù)庫用作這個(gè)實(shí)例中所有新建的數(shù)據(jù)庫的“模板”,對model數(shù)據(jù)庫的任何修改都會反應(yīng)到之后新建的其它數(shù)據(jù)庫里面。在 Oracle中就沒有這樣的模板,不過在你新建一個(gè)表空間的時(shí)候,你可以指定這是一個(gè)永久的表空間或者是其他類似TEMP和UNDO一樣的表空間,永久表空間才是用來保存用戶數(shù)據(jù)的。
SQL Server的tempdb用作整個(gè)實(shí)例的“試驗(yàn)田”,每次實(shí)例重新啟動的時(shí)候tempdb都會重新創(chuàng)建。Oracle的TEMP表空間的作用類似:用來包括大的排序操作的中間結(jié)果。當(dāng)然SQL Server的tempdb還能用來保存行版本(row versioning)所需要的信息,當(dāng)行版本啟用后,行版本特性可以保證數(shù)據(jù)庫引擎能將數(shù)據(jù)行的每次的修改記錄保留下來,修改之前的行會保存在tempdb里面的版本庫中,一般查詢會返回一個(gè)數(shù)據(jù)行上最后提交的版本,當(dāng)一個(gè)使用了特定隔離級別的依賴行版本的讀操作不再會阻塞其它修改同樣數(shù)據(jù)的事務(wù),這是因?yàn)樽x操作不會在數(shù)據(jù)行上使用共享鎖。不過這個(gè)特性需要在單個(gè)數(shù)據(jù)庫上單獨(dú)啟用。
Oracle中使用一個(gè)單獨(dú)的表空間——著名的UNDO表空間——來達(dá)成同樣目的。UNDO表空間保存著被DML語句修改的數(shù)據(jù)塊的讀一致性的副本。當(dāng)用戶開始對數(shù)據(jù)進(jìn)行修改的時(shí)候,修改之前的數(shù)據(jù)塊會被保存到UNDO表空間中,當(dāng)另外一個(gè)用戶需要查詢這些數(shù)據(jù)的時(shí)候,他取到的實(shí)際上是UNDO表空間中查出來的讀一致性的版本。不像SQL Server的行版本,Oracle的UNDO不需要啟用——因?yàn)樗菍儆贠racle并行訪問機(jī)制的一部分。
最后一個(gè)要介紹的SQL Server中的msdb數(shù)據(jù)庫,SQL Server代理服務(wù)需要操作這個(gè)庫。SQL Server代理負(fù)責(zé)計(jì)劃任務(wù)、警告、復(fù)制、日志傳送以及其它的很多東西,代理服務(wù)的正常運(yùn)行離不開msdb數(shù)據(jù)庫。
在Oracle沒有明確與mdsb數(shù)據(jù)對應(yīng)的東西。SYSAUX表空間也是一個(gè)系統(tǒng)表空間,在安裝過程中(譯注:準(zhǔn)確說應(yīng)該為“數(shù)據(jù)庫創(chuàng)建過程中”)創(chuàng)建,它里面保存了諸如Oracle AWR(Automatic Workload Repository)信息、多維數(shù)據(jù)和多媒體數(shù)據(jù),XML數(shù)據(jù)庫等等。