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ù)據(jù)庫和表空間

SQL Server和Oracle之間第一個架構(gòu)級別的差異就在于對實例 (instance)和數(shù)據(jù)庫(database)概念的定義了。

SQL Server中,實例一詞用來代表一個包含了操作系統(tǒng)文件、內(nèi)存結(jié)構(gòu)、后臺進程以及注冊表信息的獨立的應用服務。在Windows系統(tǒng)中用一個存在著停止和運行狀態(tài)的服務來代表一個實例,當處于運行狀態(tài)時,實例要占用一定的服務器內(nèi)存以及生成一定數(shù)量的后臺進程。

SQL Server實例的中心是數(shù)據(jù)庫。一個SQL Server數(shù)據(jù)庫指的是一個資料庫以及操作數(shù)據(jù)所需要的程序代碼,當實例沒有運行時,實例中的數(shù)據(jù)庫就不能夠訪問。

SQL Server有兩種數(shù)據(jù)庫:系統(tǒng)數(shù)據(jù)庫(system databases)和用戶數(shù)據(jù)庫(user databases)。在一個SQL Server實例安裝完成之后,將會自動創(chuàng)建5個系統(tǒng)數(shù)據(jù)庫:master, model, msdb, tempdb和resource。如果一個機器上面安裝了多個SQL Server實例時,沒有實例都會有自己單獨的一套系統(tǒng)數(shù)據(jù)庫。除了msdb數(shù)據(jù)庫之外,其它數(shù)據(jù)庫不能訪問或是被損壞都會導致實例無法啟動。相比之下用戶數(shù)據(jù)庫由DBA或者是開發(fā)人員在數(shù)據(jù)庫實例安裝完畢、系統(tǒng)數(shù)據(jù)庫都啟動之后所創(chuàng)建的,這些數(shù)據(jù)庫中保存著公司的業(yè)務資料。

簡而言之,一個SQL Server實例總是要包含一些數(shù)據(jù)庫(盡管有時只是那些系統(tǒng)數(shù)據(jù)庫),一個數(shù)據(jù)庫也總是要有一個(且僅有一個)與之關(guān)聯(lián)的實例。

從物理角度說,一個SQL Server數(shù)據(jù)庫表現(xiàn)為存儲于磁盤上面的一組操作系統(tǒng)文件的集合。數(shù)據(jù)庫文件分為兩種:數(shù)據(jù)文件 (data file)和事務日志文件(transaction log file)。一個數(shù)據(jù)庫至少要包含一個數(shù)據(jù)文件和一個事務日志文件,SQL Server數(shù)據(jù)庫的資料主要是存在于數(shù)據(jù)文件中,事務日志文件用來記錄發(fā)生在這些數(shù)據(jù)上面的變更記錄,SQL Server在執(zhí)行系統(tǒng)恢復的時候要用到它。一個數(shù)據(jù)文件或事務日志文件只能隸屬于一個特定的數(shù)據(jù)庫,不存在兩個數(shù)據(jù)庫共用一個數(shù)據(jù)文件或者是日志文件的情況。一個數(shù)據(jù)量很大的數(shù)據(jù)庫可以使用多個數(shù)據(jù)文件,這些數(shù)據(jù)文件能夠被邏輯的組合成一個稱為文件組(file group)的邏輯組。

在Oracle中,這一切看起來都有點反著來了。當Oracle啟動時,它和SQL Server一樣要先占用一些服務器內(nèi)存用于執(zhí)行操作,這個內(nèi)存區(qū)域——著名的SGA(System Global Area)—— 被分為數(shù)個不同的結(jié)構(gòu),在創(chuàng)建SGA的同時也會啟動一系列的后臺進程用于和SGA進行交互,在這里這些分配的內(nèi)存空間和后臺進程組合起來就是Oracle實例了。請注意現(xiàn)在我們沒有見到數(shù)據(jù)庫的影子還,實際上 Oracle實例在沒有數(shù)據(jù)庫或是數(shù)據(jù)庫不能訪問時也是跑的很好的,在安裝Oracle時,我們可以選擇只安裝軟件,完了之后再安裝數(shù)據(jù)庫。

Oracle中的數(shù)據(jù)包含了一組操作系統(tǒng)文件。不像SQL Server數(shù)據(jù)庫,Oracle數(shù)據(jù)庫并不能代表數(shù)據(jù)庫對象的邏輯分組,它更像是表示包含多個存在于磁盤上的用來保存數(shù)據(jù)的文件的一個單個的集合名詞。

組成Oracle數(shù)據(jù)庫的文件可以分成三個類型:數(shù)據(jù)文件(data file)、重做日志文件(redo log file)和控制文件(control file)。數(shù)據(jù)文件保存數(shù)據(jù),Oracle中可以存在任意數(shù)量的數(shù)據(jù)文件;重做日志文件跟SQL Server的事務日志文件一樣用來保存對數(shù)據(jù)更改的記錄,在系統(tǒng)恢復階段需要用到;控制文件是一些特別的小文件,用來保存一些至關(guān)重要的關(guān)于數(shù)據(jù)庫的信息,沒有這個文件的話,實例就無法打開數(shù)據(jù)庫。

除了數(shù)據(jù)文件、重做日志文件、控制文件之外,數(shù)據(jù)庫還包含參數(shù)文件(parameter file)、密碼文件(password file)和可選的歸檔日志文件(archive log files),后面很快會對這些文件類型展開討論。

Oracle系統(tǒng)啟動時,首先在內(nèi)存中創(chuàng)建數(shù)據(jù)庫實例,然后由實例找到保存在磁盤中的數(shù)據(jù)庫,最后打開數(shù)據(jù)庫讓用戶操作。當系統(tǒng)關(guān)閉時,實例會從內(nèi)存中清除掉:整個內(nèi)存結(jié)構(gòu)和后臺進程都會消失,但是數(shù)據(jù)庫依然存在于磁盤上,只是處于關(guān)閉的狀態(tài)。之前也說過,Oracle實例可以在不打開數(shù)據(jù)庫的情況下運行——這是與SQL Server數(shù)據(jù)庫最大的不同,SQL Server實例是不能夠離開系統(tǒng)數(shù)據(jù)庫而運行的。不過和SQL Server一樣Oracle數(shù)據(jù)庫在實例沒有啟動的情況下也是不能訪問的。

一般來說Oracle實例和數(shù)據(jù)庫之間是一對一的關(guān)系。一個實例對應著一個數(shù)據(jù)庫,但是一個數(shù)據(jù)庫卻可以同時由多個實例去訪問它。一個獨立的 Oracle安裝包含一個實例和一個供實例操作的數(shù)據(jù)庫,而配置成RAC(Real Application Cluster)的安裝則可以允許多個存在于不同機器上的實例訪問存在于一個共享磁盤上面的數(shù)據(jù)庫。

那Oracle中數(shù)據(jù)庫對象的邏輯分組在那兒呢?在SQL Server中邏輯分組由數(shù)據(jù)庫自己來完成,而在Oracle中,這項工作由表空間(tablespace)完成,Oracle表空間是用來對表、視圖、索引和其他數(shù)據(jù)庫對象進行分組的邏輯結(jié)構(gòu)。例如,你的 Oracle產(chǎn)品庫可以給HR應用一個單獨的表空間,支付應用則使用另外一個。一個數(shù)據(jù)庫可以邏輯的分成若干個表空間,這些表空間在物理上則由一個或者多個數(shù)據(jù)文件組成。因此在Oracle中與SQL Server數(shù)據(jù)庫等價的是表空間。

由于這兩種結(jié)構(gòu)在功能上相當類似,在SQL Server中建立數(shù)據(jù)庫的過程和在Oracle中建立表空間的過程也非常相似。不管是建立數(shù)據(jù)庫還是表空間,DBA都要首先指定一個名字,然后給新建的數(shù)據(jù)庫或者表空間分配一個或多個數(shù)據(jù)文件,并為每個數(shù)據(jù)文件指定初始大小和數(shù)據(jù)增長情況。

在SQL Server中可以做到讓一個用戶數(shù)據(jù)庫離線或是只讀,Oracle的用戶表空間也一樣可以。在SQL Server中可以讓一個用戶數(shù)據(jù)庫中的一個或者多個數(shù)據(jù)文件只讀,而Oracle用戶表空間中的一個或者多個數(shù)據(jù)文件也同樣能標記為離線。

不過數(shù)據(jù)庫和表空間在某些方面還是有差別的:

* SQL Server中,數(shù)據(jù)文件可以用文件組邏輯的進行分組,而Oracle表空間就沒有類似的概念。

* SQL Server的每個數(shù)據(jù)庫都有自己的事務日志文件,而且在創(chuàng)建數(shù)據(jù)庫的時候就要指定這些日志文件的屬性。而在Oracle中整個數(shù)據(jù)庫(意為所有的表空間)的事務日志都是記錄在同樣的一樣重做日志中,因此也不存在說給每個表空間建立一個單獨的日志文件的說法。

* SQL Server中,數(shù)據(jù)庫可以設(shè)置成簡單恢復模式(simple recovery mode),簡單恢復模式指的是活動的數(shù)據(jù)庫日志在checkpoint操作完成之后就會截斷。Oracle也有類似的概念,這個稍后會說到,不過不能在表空間級別上進行這樣的設(shè)置。

top實例名和SID

SQL Server和Oracle都允許在同一個機器上面同時運行多個實例,多個實例的執(zhí)行環(huán)境是完全獨立的:就單個的數(shù)據(jù)庫引擎而言,它并不知道也不關(guān)心有沒有其他的實例在這個機器上運行著。

在SQL Server中這種機制通過實例這個概念來實現(xiàn),SQL Server可以作為一個命名的(named) 或是 默認(default) 的實例來運行,默認實例的名字和運行它的Windows服務器的名字一樣,顯然一個系統(tǒng)的默認實例只可能存在一個,不過在一個機器上可以存在多個命名的實例,命令實例的名字格式為 HOSTNAMEINSTANCE_NAME ,同一個主機上每個運行實例的 INSTANCE_NAME 必須是唯一的,每個實例都有著自己的一套程序文件以及一些與其它實例共享的通用組件。

而Oracle也差不多,在安裝Oracle的時候,DBA就需要指定一個 全局數(shù)據(jù)庫名(Global Database Name)和系統(tǒng)標識符 (SID, System Identifier)。Oracle中實例和數(shù)據(jù)庫是完全不同的東西,一個全局數(shù)據(jù)庫名用來在網(wǎng)絡上唯一的識別一個數(shù)據(jù)庫的存放位置,一個完整的名字通常是下面的格式database_name.network_domain_name。 SID則是用來識別一個與數(shù)據(jù)庫關(guān)聯(lián)的實例,大都數(shù)情況下一個實例關(guān)聯(lián)一個單個的數(shù)據(jù)庫,數(shù)據(jù)庫名和SID名字會是一樣。RAC環(huán)境中就不一樣了,RAC 允許多個實例訪問放在共享存儲中的同一個數(shù)據(jù)庫,此時的實例名和數(shù)據(jù)庫名字將不一樣。當然和SQL Server一樣,一個Oracle數(shù)據(jù)庫服務器上面是不允許兩個實例使用同一個SID的,另外一點類似的就是在安裝時一旦指定,不管是SQL Server實例名還是Oracle SID都是不能再修改了。

SQL Server DBA可以通過下面的語句查詢當前登錄系統(tǒng)的實例名:
查看源代碼
打印幫助
1 SELECT @@SERVERNAME

Oracle DBA用來查詢實例名和數(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)表空間

一個SQL Server實例需要有5個系統(tǒng)數(shù)據(jù)庫(2005之前的是4個):master, model, msdb, tempdb和resource,一個Oracle數(shù)據(jù)庫則最少需要3個系統(tǒng)表空間才能正常操作,它們是:SYSTEM, SYSAUX和TEMP。

master和resource數(shù)據(jù)庫集中保存了SQL Server自身管理所需要的所有信息,里面保存了諸如系統(tǒng)配置,數(shù)據(jù)庫列表和文件路徑、終結(jié)點、連接服務器和用戶帳戶(或“登錄”信息),系統(tǒng)級別的對象存儲在只讀的數(shù)據(jù)庫”資源(resource)”中。

在Oracle中,SYSTEM表空間等價于master數(shù)據(jù)庫,SYSTEM表空間包含了數(shù)據(jù)字典(data dictionary),也就是關(guān)于Oracle自身的元數(shù)據(jù)(metadata),這里的數(shù)據(jù)字典可以和SQL Server中的resource數(shù)據(jù)庫進行類比。到這里你也許猜到了:如果SYSTEM不存在或是損壞了的話Oracle數(shù)據(jù)庫是打不開的。

對于一個SQL Server實例,model數(shù)據(jù)庫用作這個實例中所有新建的數(shù)據(jù)庫的“模板”,對model數(shù)據(jù)庫的任何修改都會反應到之后新建的其它數(shù)據(jù)庫里面。在 Oracle中就沒有這樣的模板,不過在你新建一個表空間的時候,你可以指定這是一個永久的表空間或者是其他類似TEMP和UNDO一樣的表空間,永久表空間才是用來保存用戶數(shù)據(jù)的。

SQL Server的tempdb用作整個實例的“試驗田”,每次實例重新啟動的時候tempdb都會重新創(chuàng)建。Oracle的TEMP表空間的作用類似:用來包括大的排序操作的中間結(jié)果。當然SQL Server的tempdb還能用來保存行版本(row versioning)所需要的信息,當行版本啟用后,行版本特性可以保證數(shù)據(jù)庫引擎能將數(shù)據(jù)行的每次的修改記錄保留下來,修改之前的行會保存在tempdb里面的版本庫中,一般查詢會返回一個數(shù)據(jù)行上最后提交的版本,當一個使用了特定隔離級別的依賴行版本的讀操作不再會阻塞其它修改同樣數(shù)據(jù)的事務,這是因為讀操作不會在數(shù)據(jù)行上使用共享鎖。不過這個特性需要在單個數(shù)據(jù)庫上單獨啟用。

Oracle中使用一個單獨的表空間——著名的UNDO表空間——來達成同樣目的。UNDO表空間保存著被DML語句修改的數(shù)據(jù)塊的讀一致性的副本。當用戶開始對數(shù)據(jù)進行修改的時候,修改之前的數(shù)據(jù)塊會被保存到UNDO表空間中,當另外一個用戶需要查詢這些數(shù)據(jù)的時候,他取到的實際上是UNDO表空間中查出來的讀一致性的版本。不像SQL Server的行版本,Oracle的UNDO不需要啟用——因為它是屬于Oracle并行訪問機制的一部分。

最后一個要介紹的SQL Server中的msdb數(shù)據(jù)庫,SQL Server代理服務需要操作這個庫。SQL Server代理負責計劃任務、警告、復制、日志傳送以及其它的很多東西,代理服務的正常運行離不開msdb數(shù)據(jù)庫。

在Oracle沒有明確與mdsb數(shù)據(jù)對應的東西。SYSAUX表空間也是一個系統(tǒng)表空間,在安裝過程中(譯注:準確說應該為“數(shù)據(jù)庫創(chuàng)建過程中”)創(chuàng)建,它里面保存了諸如Oracle AWR(Automatic Workload Repository)信息、多維數(shù)據(jù)和多媒體數(shù)據(jù),XML數(shù)據(jù)庫等等。

分享到

hanrui

相關(guān)推薦