程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle體系結構全面介紹

Oracle體系結構全面介紹

編輯:Oracle數據庫基礎

通過學習數據庫及實例,我們可以知道Oracle體系結構中的可分為三個范疇:數據庫內部結構(如表)、存儲區內部的結構(包括共享存儲區和進程)、數據庫的外部結構。

一、Oracle體系結構中的內部結構
數據庫的內部結構,即Oracle數據的邏輯表現層,也稱Oracleschema,包括以下這些內容:
1.表、列、約束條件、數據類型(包括抽象數據類型)
2.分區與子分區
3.用戶與模式
4.索引、簇和散列簇
5.視圖
6.序列
7.過程、函數、軟件包和觸發器
8.同義詞
9.權限及角色
10.數據庫鏈接
11段、盤區和塊
12.回滾段
13.快照與顯形圖
14.各部分的具體介紹以後將在Oralceschema欄目中討論。

二、Oracle體系結構中的內部存儲結構
包括內存緩沖池與後台進程:

1.系統全局區(SGA),主要包括:

1)數據塊緩存區
數據塊緩存區(datablockbuffercache)是SGA中的一個高速緩存區域,用來存儲從數據庫中讀取數據段的數據塊(如表、索引和簇)。數據塊緩存區的大小由數據庫服務器init.ora文件中的DB_LOCK_BUFFERS參數決定(用數據庫塊的個數表示)。在調整和管理數據庫時,調整數據塊緩存區的大小是一個重要的部分。

因為數據塊緩存區的大小固定,並且其大小通常小於數據庫段所使用的空間,所以它不能一次裝載下內存中所有的數據庫段。通常,數據塊緩存區只是數據庫大小的1%~2%,Oracle使用最近最少使用(LRU,leastrecentlyused)算法來管理可用空間。當存儲區需要自由空間時,最近最少使用塊將被移出,新數據塊將在存儲區代替它的位置。通過這種方法,將最頻繁使用的數據保存在存儲區中。

然而,如果SGA的大小不足以容納所有最常使用的數據,那麼,不同的對象將爭用數據塊緩存區中的空間。當多個應用程序共享同一個SGA時,很有可能發生這種情況。此時,每個應用的最近使用段都將與其他應用的最近使用段爭奪SGA中的空間。其結果是,對數據塊緩存區的數據請求將出現較低的命中率,導致系統性能下降。

2)字典緩存區
數據庫對象的信息存儲在數據字典表中,這些信息包括用戶帳號數據、數據文件名、段名、盤區位置、表說明和權限,當數據庫需要這些信息(如檢查用戶查詢一個表的授權)時,將讀取數據字典表並且將返回的數據存儲在字典緩存區的SGA中。

數據字典緩存區通過最近最少使用(LRU)算法來管理。字典緩存區的大小由數據庫內部管理。字典緩存區是SQL共享池的一部分,共享池的大小由數據庫文件init.ora中的SHARED_POOL_SIZE參數來設置。

如果字典緩存區太小,數據庫就不得不反復查詢數據字典表以訪問數據庫所需的信息,這些查詢稱為循環調用(recuesivecall),這時的查詢速度相對字典緩存區獨立完成查詢時要低。

3)重做日志緩沖區
重做項描述對數據庫進行的修改。它們寫到聯機重做日志文件中,以便在數據庫恢復過程中用於向前滾動操作。然而,在被寫入聯機重做日志文件之前,事務首先被記錄在稱作重做日志緩沖區(redologbuffer)的SGA中。數據庫可以周期地分批向聯機重做日志文件中寫重做項的內容,從而優化這個操作。重做日志緩沖區的大小(以字節為單位)由init.ora文件中的LOG_BUFFER參數決定。

4)SQL共享池
SQL共享池存儲數據字典緩存區及庫緩存區(librarycache),即對數據庫進行操作的語句信息。當數據塊緩沖區和字典緩存區能夠共享數據庫用戶間的結構及數據信息時,庫緩存區允許共享常用的SQL語句。

SQL共享池包括執行計劃及運行數據庫的SQL語句的語法分析樹。在第二次運行(由任何用戶)相同的SQL語句時,可以利用SQL共享池中可用的語法分析信息來加快執行速度。

SQL共享池通過LRU算法來管理。當SQL共享池填滿時,將從庫緩存區中刪掉最近最少使用的執行路徑和語法分析樹,以便為新的條目騰出空間。如果SQL共享池太小,語句將被連續不斷地再裝入到庫緩存區,從而影響操作性能。

SQL共享池的大小(以字節為單位)由init.ora文件參數SHARED_POOL_SIZE決定。

5)大池
大池(LargePool)是一個可選內存區。如果使用線程服務器選項或頻繁執行備份/恢復操作,只要創建一個大池,就可以更有效地管理這些操作。大池將致力於支持SQL大型命令。利用大池,就可以防止這些SQL大型命令把條目重寫入SQL共享池中,從而減少再裝入到庫緩存區中的語句數量。大池的大小(以字節為單位)通過init.ora文件的LARGE_POOL_SIZE參數設置,用戶可以使用init.ora文件的LARGE_POOL_MIN_ALLOC參數設置大池中的最小位置。Oracle8i已不用這個參數。作為使用LargePool的一種選擇方案,可以用init.ora文件的SHARED_POOL_RESERVED_SIZE參數為SQL大型語句保留一部分SQL共享池。

6)Java池
由其名字可知,Java池為Java命令提供語法分析。Java池的大小(以字節為單位)通過在Oracle8i引入的init.ora文件的JAVA_POOL_SIZE參數設置。init.ora文件的Java_POOL_SIZE參數缺省設置為10MB。

7)多緩沖池
可以在SGA中創建多個緩沖池,能夠用多個緩沖池把大數據集與其他的應用程序分開,以減少它們爭奪數據塊緩存區內相同資源的可能性。對於創建的每一個緩沖池,都要規定其LRU鎖存器的大小和數量。緩沖區的數量必須至少比LRU鎖存器的數量多50倍。

創建緩沖池時,需要規定保存區(keeparea)的大小和再循環區(recyclearea)的大小。與SQL共享池的保留區一樣,保存區保持條目,而再循環區則被頻繁地再循環使用。可以通過BUFFER_POOL_KEEP參數規定來保存區的大小。例如:
保存和再循環緩沖池的容量減少了數據塊緩沖存儲區中的可用空間(通過DB_BLOCK_BUFFERS參數設置)。對於使用一個新緩沖池的表,通過表的storage子句中的buffer_pool參數來規定緩沖池的名字。例如,如果需要從內存中快速刪除一個表,就把它賦予RECYCLE池。缺省池叫作DEFAULT,這樣就能在以後用altertable命令把一個表轉移到DEFAULT池。

2.程序全局區(PGA)。
程序全局區(PGA,ProgramGlobalArea)是存儲區中的一個區域,由一個Oracle用戶進程所使用,PGA中的內存不能共享。

3.環境區

4.後台進程
數據庫擁有多個後台進程,其數量取決於數據庫的配置。這些進程由數據庫管理,它們只需要進行很少的管理。每個後台進程創建一個跟蹤文件。在實例操作期間保存跟蹤文件。後台進程跟蹤文件的命名約定和位置隨操作系統和數據庫版本而不同。一般來說,跟蹤文件含有後台進程名或後台進程的操作系統進程ID。可以設置初始化參數文件的BACKGROUND_DUMP_DEST參數來規定後台進程跟蹤文件的位置,但是有些版本的Oracle忽略這種設置。排除數據庫故障時,跟蹤文件就顯得非常重要。影響後台進程的嚴重問題通常記錄在數據庫的警告日志上。警告日志通常位於BACKGROUND_DUMP_DEST目錄下。一般來說,這個目錄是Oracle_BASE目錄下的/ADMIN/INSTANCE_NAME/BDUMP目錄。

1)SMON
當啟動一個數據庫時,SMON(SystemMonitor,系統監控程序)進程執行所需的實例恢復操作(使用聯機重做日志文件),它也可以清除數據庫,取消系統不再需要的事務對象。SMON的另一個用途是:將鄰接的自由盤區組成一個較大的自由盤區。對於某些表空間,數據庫管理員必須手工執行自由空間合並;SMON只合並表空間中的自由空間,這些表空間的缺省pctincrease存儲值為非零。

2)PMON
PMON(進程監控程序)後台進程清除失敗用戶的進程,釋放用戶當時正在使用的資源。當一個持有鎖的進程被取消時,其效果是顯而易見的,PMON負責釋放鎖並使其可以被其他用戶使用。同SMON一樣,PMON周期性地喚醒檢測它是否需要被使用。

3)DBWR
DBWR(數據庫寫入程序)後台進程負責管理數據塊緩存區及字典緩存區的內容。它以批方式把修改塊從SGA寫到數據文件中。

盡管每一個數據庫實例只有一個SMON和一個PMON進程在運行,但是根據平台和操作系統的不同,用戶可以同時擁有多個DBWR進程。使用多個DBWR進程有助於在進行大的操作期間減少DBWR中的沖突。所需DBWR進程的數量由數據庫的init.ora文件中的DB_WRITER_PROCESSES參數決定。如果系統支持異步I/O,可以用多個DBWRI/O從(slave)進程創建一個DBWR進程。DBWRI/O從進程的數量由init.ora文件的DBWR_I/O_SLAVES參數設置。

如果創建多個DBWR進程,這些進程就不叫做DBWR,它們將有一個數字分量。例如,如果創建5個DBWR進程,進程的操作系統名就可能是DBW0、DBW1、DBW2、DBW3和DBW4。
4)LGWR
LGWR(日志寫入程序)後台進程負責把聯機重做日志緩沖區的內容寫入聯機重做日志文件。LGWR分批將日志條目寫入聯機重做日志文件。重做日志緩沖區條目總是包含著數據庫的最新狀態,這是因為DBWR進程可以一直等待到把數據塊緩沖區中的修改數據塊寫入到數據文件中。

LGWR是數據庫正常操作時唯一向聯機重做日志文件寫入內容並從重做日志緩沖區直接讀取內容的進程。與DBWR對數據文件執行的完全隨機訪問相反,聯機重做日志文件以序列形式寫入。如果聯機重做日志文件是鏡像文件,LGWR同時向鏡像日志文件中寫內容。

對於Oracle8,可以創建多個LGWRI/O從進程以改善向聯機重做日志文件的寫入性能,其個數由數據庫的init.ora文件的LGWR_IO_SLAVES參數決定。

在Oracle8i中,這個參數已不能用,LGWRI/O從進程由DBWR_IO_SLAVES設置值派生
而來。

5)CKPT
CKPT(檢查點進程)用來減少執行實例恢復所需的時間。檢查點使DBWR把上一個檢查點以後的全部已修改數據塊寫入數據文件,並更新數據文件頭部和控制文件以記錄該檢查點。

當一個聯機重做日志文件被填滿時,檢查點進程會自動出現。可以用數據庫實例的init.ora文件中的LOG_CHECKPOINT_INTERVAL參數來設置一個頻繁出現的檢查點。

CKPT後台進程把早期數據庫版本中LGWR的兩個功能(向檢查點發信號及復制日志內容)分成兩個後台進程。當數據庫實例的init.ora文件中的CHECKPOINT_PROCESS參數被設置為TRUE時,就可以建立CKPT後台進程。

6)ARCH
LGWR後台進程以循環方式向聯機重做日志文件寫入;當填滿第一個日志文件後,就開始向第二個日志文件寫入;第二個日志文件填滿後,再向第三個日志文件寫入。一旦最後一個重做日志文件填滿,LGWR就開始重寫第一個重做日志文件的內容。

當Oracle以ARCHIVELOG(歸檔日志)模式運行時,數據庫在開始重寫重做日志文件之前先對其進行備份。這些歸檔的重做日志文件通常寫入一個磁盤設備中。也可以直接寫入磁帶設備中,但是這往往要增加操作員的勞動強度。

這種歸檔功能由ARCH(歸檔進程)後台進程完成,利用該性能的數據庫在處理大數據事務時將遇到重做日志磁盤沖突問題,這是因為當LGWR准備寫入一個重做日志文件時,ARCH正准備讀取另一個。如果歸檔日志目標磁盤寫滿,數據庫還將遇到數據庫鎖定問題。此時,ARCH凍結,禁止LGWR寫入;從而禁止在數據庫中出現進一步的事務處理;這種情況一起延續到歸檔重做日志文件的空間清空為止。

對於Oracle8,可以創建多個ARCHI/O從進程以改善對歸檔重做日志文件的寫入功能。在Oracle8.0中,ARCHI/O從進程的個數由數據庫的init.ora文件中的ARCH_IO_SLAVES參數決定。在Oracle8i中,這個參數已不能用,ARCH_IO_SLAVES設置值由DBWR_IO_SLAVES設置值派生。

7)RECO
RECO(恢復進程)後台進程用於解決分布式數據庫中的故障問題。RECO進程試圖訪問存在疑問的分布式事務的數據庫並解析這些事務。只有在平台支持DistributedOption(分布式選項)且init.ora文件中的DISTRIBUTED_TRANSACTIONS參數大於零時才創建這個進程。

8)SNPn
Oracle的快照刷新及內部作業隊列調度依賴於它們執行的後台進程(快照進程)。這些後台進程的名字以字母SNP開頭,以數字或字母結束。為一實例所創建的SNP進程的個數由數據庫的init.ora文件中的JOB_QUEUE_PROCESSES參數決定(在Oracle7中,該參數名為SNAPSHOT_REFRESH_PROCESSES)。

9)LCKn
當采用Oracle並行服務器選項時,多個LCK(鎖定進程)後台進程(命名為LCK0~LCK9)用於解決內部實例的鎖定問題。LCK進程的個數由GC_LCK_PROCS參數決定。

10)Dnnn
Dnnn(調度程序進程)是MTS結構的一部分;這些進程有助於減少處理多重連接所需要的資源。對於數據庫服務器支持的每一個協議必須至少創建一個調度程序進程,調度程序進程根據SQL*Net(或Net8)的配置在數據庫啟動時創建,在數據庫打開後可以創建或取消。

11)Snnn
創建Snnn(服務器進程)來管理需要專用服務器的數據庫連接。服務器進程可以對數據文件進行I/O操作。

12)Pnnn
如果啟動數據庫中的並行查詢選項,一個查詢的資源要求可以分布在多個處理器中。當實例啟動由init.ora文件的PARALLEL_MIN_SERVERS參數確定時,指定數目的並行查詢服務器進程就啟動。每一個這樣的進程都將出現在操作系統級。需要並行操作的進程越多,啟動的並行查詢服務器進程就越多。每個並行查詢服務器進程在操作系統級將有一個P000、P001、P002這樣的名字。並行查詢服務器進程的最大數量由init.ora文件的PARALLEL_MAX_SERVERS參數確定。

三、Oracle體系結構中的的外部結構

1.重做日志
Oracle保存所有數據庫事務的日志。這些事務被記錄在聯機重做日志文件(onlineredologfile)中。當數據庫被破壞時,這些日志文件能夠以正確順序恢復數據庫事務。重做日志文件信息存儲在數據庫數據文件的外部。

重做日志文件也可以讓Oracle優化向磁盤寫入數據的方式。當數據庫中出現一個事務時,就把該事務輸入到重做日志緩沖區;同時受該事務影響的數據塊不會立即寫入磁盤。

每個Oracle數據庫都有兩個或更多的聯機重做日志文件。Oracle以循環方式向聯機重做日志文件寫入:第一個日志文件被填滿後,就向第二個日志文件寫入,然後依次類推。當所有聯機重做日志文件都被填滿時,就又回到第一個日志文件,用新事務的數據對其進行重寫。如果數據庫正以ARCHIVELOG模式運行,在重寫聯機重做日志文件前,數據庫將先對其進行備份。任何時候都可以用這些歸檔重做日志文件來恢復數據庫的任何部分。

重做日志文件可以被數據庫鏡像(復制)。鏡像聯機重做日志文件不依賴操作系統或操作環境的硬件性能就可以對重做日志文件進行鏡像。

2.控制文件
數據庫的全局物理結構由其控制文件(controlfile)維護。控制文件記錄數據庫中所有文件的控制信息。控制文件維護內部的一致性並引導恢復操作。

由於控制文件對數據庫至關重要,所以聯機存儲著多個拷貝。這些文件一般存儲在各個不同的磁盤上,以便將因磁盤失效引起的潛在危險降至最低限度。創建數據庫時,同時就提供與之對應的控制文件。

數據庫控制文件的名字通過init.ora文件的CONTROL_FILES參數規定。盡管這是一個init.ora參數,但是CONTORL_FILES參數通常用config.ora文件規定,因為它很少變化。如果需要給數據庫添加一個新的控制文件,可關閉實例,把已存在的一個控制文件復制到新的地址,把新的地址添加到CONTROL_FILES參數設置值上,並重新啟動這個實例。

3.跟蹤文件與警告日志
在實例中運行的每一個後台進程都有一個跟蹤文件與之相連。跟蹤文件記載後台進程遇到的重大事件的信息。除了跟蹤文件外,Oracle還有一個稱作警告日志(alertlog)的文件,警告日志記錄數據庫文件運行中主要事件的命令及結果。例如,表空間的創建、重做日志的轉換、操作系統的恢復、數據庫的建立等信息都記錄在警告日志中。警告日志是數據庫每日管理的重要資源,當需要查找主要失敗原因時,跟蹤文件就非常有用。

應經常監控警告日志。警告日志的條目將通知你數據庫操作期間遇到的任何問題,其中包括出現的任何ORA_0600內部錯誤。為使警告日志便於使用,最好是每天能自動對其重新命名。例如,如果警告日志稱作alert_orcl.log,可以對它重新命名,以便其文件名包括當前日期。下次Oracle要寫該警告日志時,將找不到具有alert_orcl.log文件名的文件,因此數據庫將創建一個新的文件名。這樣,除了有以前的警告日志外,還有一個當前的警告日志(alert_orcl.log)。用這種方式區分警告日志條目就可以使對警告日志條目的分析更有效。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved