ORACLE之 體系結構

ORACLE 體系結構

ORACLE 體系結構框架

ORACLE 體系結構框架主要包括如下三個方面:
① 內存結構:系統全局區 SGA(共享池,數據庫緩衝區,重做日誌緩衝區等),程序全局區 PGA(棧區、數據區)。
② 物理結構:數據文件,日誌文件,控制文件,參數文件。
③ 進程:用戶進程,服務器進程,後臺進程。

 ORACLE 內存結構

ORACLE 內存結構包含兩類:系統全局區(SGA)和程序全局區(PGA)。

系統全局區(SGA System Global Area)
oracle 系統爲實例分配的一組共享緩衝存儲區。用於存儲數據庫信息的內存區,該信息爲數據庫進程所共享,同時包含 oracle 服務器的數據和控制信息。
SGA_MAX_SIZE 參數可設定 SGA 所佔用的最大內存空間,建議應小於物理內存的一半、儘量不要超過機器物理內存的大小。如果 SGA_MAX_SIZE 的設定值小於其它 SGA 相關參數設定值的總和或是小於各相關參數默認值的總和,則 SGA_MAX_SIZE 的設定值無效。

共享池(Shared Pool)
SGA 的保留區,用於存儲如 SQL、PL/SQL 存儲過程、包、數據字典、鎖、字符集信息和安全屬性等。共享池含有庫高速緩存(library cache)和字典高速緩存區(dictionary cache)
其大小由 SHARED_POOL_SIZE 參數決定,建議爲:物理內存×(15~20)%。

1.
庫緩衝區(Library Cache)
分爲共享SQL區和共享PL/SQL區,存儲了最近用到的SQL或PL/SQL語句信息,包括:SQL或PL/SQL語句的文本、語法分析形式、執行方案等。
在第二次運行(由任何用戶)相同的SQL語句時,可以利用庫緩衝區中可用的語法分析信息來加快執行速度。
庫緩衝區通過LRU(Least Recently Used)算法來管理:當其空間填滿時,將刪掉最近最少使用的信息,以便爲新的條目騰出空間。

2.
數據字典緩衝區(Data Dictionary Cache)
存儲瞭解析SQL語句時所需要的系統信息,可能包含:數據庫文件、表、索引、字段、用戶、權限以及其它數據庫對象。
在解析階段,服務進程會查找數據字典的相關信息來確定對象命名和有效訪問,而將數據字典信息緩存到內存中則提高了查詢的響應時間。

數據庫緩衝區(Database Buffer Cache)
用於存儲從數據文件中讀出的數據塊複本,以便提高獲取和更新數據的性能。
也是通過LRU算法來管理可用空間:當存儲區需要自由空間時,最近最少使用塊將被移出,新數據塊將在存儲區代替它的位置。
9i 中其大小由 DB_CACHE_SIZE 參數確定,8i中則爲:DB_BLOCK_SIZE * DB_BLOCK_BUFFERS,其中:DB_BLOCK_SIZE 確定數據塊的大小,DB_BLOCK_BUFFERS 確定數據塊的數目。
數據緩衝區包括三個類型的區:
keep buffer pool
recycle buffer pool
default buffer pool

重做日誌緩衝區(Redo Log Buffer Cache)
以記錄項的形式備份了對數據庫數據塊所做的修改,這些記錄項稱爲重做項(Redo Entries),將被定期分批地寫到重做日誌文件中,以便在數據庫恢復過程中用於回滾操作。
其大小由參數 LOG_BUFFER 確定。

大池(Large Pool)
是一個可選存儲區,將致力於支持SQL大型命令,以減輕共享池的負擔。
如果使用線程服務器選項或頻繁執行備份/恢復操作,只要創建一個大池,就可以更有效地管理這些操作。
其大小由LARGE_POOL_SIZE參數設置。
不同於共享池,大池並不使用LRU列表。

Java 池(Java Pool)
也是一個可選存儲區,安裝使用了Java則需配置,爲Java命令提供語法分析。
大小由 JAVA _POOL_SIZE 參數設置。

程序全局區( PGA Program Global Area )
由單個Oracle用戶進程所使用,含有單個進程工作時需要的數據和控制信息。PGA 中的內存不能在進程間共享。

 ORACLE 進程結構

進程是操作系統中的一種機制,它可執行一系列的操作步驟,通常有它自己的專用存儲區。
oracle 實例有兩種類型:單進程實例和多進程實例。通常用的是多進程實例。
單進程 oracle 實例:是一種數據庫系統,一個進程執行全部 oracle 代碼。oracle 的代碼和用戶的數據庫應用也是單個進程執行。在單進程環境下的 oracle 實例,僅允許一個用戶可存取。例如在 MS-DOS上運行 oracle。
多進程 oracle 實例:使用多個進程來執行 oracle 的不同部分,對於每一個連接的用戶都有一個進程。
在多進程系統中,進程分爲兩類:用戶進程和 oracle 系統進程。oracle 系統進程又分爲服務器進程(server process)和後臺進程(background process)。

用戶進程
在用戶方工作,向服務器進程請求信息,如 oracle 常用工具 SQL*PLUS。

服務器進程
處理用戶與實例連接的事務,任務如下:
1、分析和執行應用所發出的 SQL 語句。
2、從數據文件讀必要的數據到 SGA 區的共享數據區。
3、返回必要信息給應用。

oracle 服務器進程


後臺進程
oracle 系統使用一些附加的進程來處理系統必須的工作。
後臺進程爲所有數據庫用戶異步完成各種任務,維持數據庫的物理結構和存儲結構之間的關係。
有四個後臺進程在第一次啓動時字段初始化,並且在實例關閉時停止運行,而在數據庫運行階段必須始終運行,這四個進程是:SMON、PMON、DBWR、LGWR
常見的後臺進程:
1、在啓動系統時運行以完成數據庫恢復的功能(SMON)
2、用戶在會話期間異常終止後,可用來釋放用戶佔用的資源(PMON)
3、在出現檢查點時將數據寫回數據文件中(DBWR)
4、讀寫重做日誌(LGWR)
5、在出現檢查點時確保將髒數據塊寫回磁盤(CKPT)
6、在ARCHIVELOG模式下,出現重做日誌交換時歸檔重做日誌的拷貝(ARCH)
7、在並行服務器配置中管理鎖(LCK)
8、當使用Oracle分佈式選件時恢復可疑的事務(RECO)
9、支持Oracle 的快照技術(SNP)

SMON(System Monitor 系統監控進程)
當啓動一個數據庫時, SMON進程執行所需的實例恢復操作(使用重做日誌文件),它也可以清除數據庫,取消系統不再需要的事務對象。
SMON 進程有規律地被呼醒,檢查是否需要,或者其它進程發現需要時可以被調用。

PMON(Process Monitor 進程監控進程)
PMON 進程清除失敗用戶的進程,釋放用戶當時正在使用的資源。當一個持有鎖的進程被取消時,其效果是顯而易見的,PMON 負責釋放鎖並使其可以被其他用戶使用。
PMON 還週期地檢查調度進程(Dispatcher)和服務器進程的狀態,如果已死則重新啓動(不包括有意刪除的進程)。同 SMON 一樣,PMON 週期性地喚醒檢測它是否需要被使用。

DBWR(Database Writer 數據庫寫入進程)
DBWR 進程負責管理數據庫緩存區及數據字典緩存區的內容,以批方式把修改塊(髒數據)從緩衝區寫到數據文件中。
當出現以下任一情況時 DBWR 進程將緩衝區內容寫入數據文件:發生 Checkpoint、達到髒數據閾值、沒有空閒的緩存、發生超時、RAC ping請求、表空間脫機、表空間只可讀、表空間開始備份、表刪除或截掉(truncate)。
每一個數據庫實例只有一個 SMON 和一個 PMON 進程在運行,但是根據平臺和操作系統的不同,用戶可以同時擁有多個 DBWR 進程(DBWn)。使用多個 DBWR 進程有助於在進行大的操作期間減少 DBWR 中的衝突。
所需 DBWR 進程的數量由 DB_WRITER_PROCESSES 參數決定。

LGWR(Log Writer 日誌寫入進程)
LGWR 進程負責把重做日誌緩衝區的內容寫入聯機重做日誌文件。數據庫正常操作時,LGWR 是唯一向聯機重做日誌文件寫入內容並從重做日誌緩衝區直接讀取內容的進程。
LGWR 分批、順序、循環地向聯機重做日誌文件寫入:
當填滿第一個日誌文件後,就開始向第二個日誌文件寫入;
第二個日誌文件填滿後,再向第三個日誌文件寫入……一旦最後一個重做日誌文件填滿, LGWR 就開始重寫第一個重做日誌文件的內容。
如果聯機重做日誌文件是鏡像文件, LGWR 同時向鏡像日誌文件中寫內容。
當出現以下任一情況時 LGWR 進程將重做日誌緩衝區內容寫入重做日誌文件:提交事務時、重做日誌緩衝區的1/3滿、有1M的重做日誌、每隔3秒、DBWR 寫入前。

CKPT(Checkpoint 檢查點進程)
CKPT 進程用來減少執行實例恢復所需的時間。該進程在檢查點出現時,通知DBWR把上一個檢查點以後的全部已修改數據塊寫入數據文件,同時更新數據文件頭部和控制文件以記錄該檢查點。
當一個聯機重做日誌文件被填滿時,檢查點進程會自動出現。也可以用 LOG_CHECKPOINT_INTERAL 參數來設置一個頻繁出現的檢查點。
當 CHECKPOINT_PROCESS 參數被設置爲 TRUE 時,就可以建立 CKPT 後臺進程。

ARCH(Archive 歸檔進程)
重做事務日誌以順序方式記錄,填滿一個日誌文件後,即通過日誌交換(Log Switch)轉向另一個可用的重做日誌文件。當 oracle 以 ARCHIVELOG (歸檔日誌)模式運行時,日誌交換時數據庫在開始重寫重做日誌文件之前先對其進行備份。這些歸檔的重做日誌文件通常寫入一個磁盤設備中,也可以直接寫入磁帶設備中。
歸檔進程(ARCH)是一個可選進程。

RECO(Recoverer 恢復進程)
RECO 進程用於解決分佈式數據庫中的故障問題。
RECO 進程試圖訪問存在疑問的分佈式事務的數據庫並解析這些事務。只有在平臺支持Distributed Option(分佈式選項)且 DISTRIBUTED_TRANSACTIONS 參數大於零時才創建這個進程。

SNPn(Job Queue Processes 作業隊列進程/快照進程)
SNP 進程用於支持 oracle 的快照刷新及內部作業隊列調度。爲一實例所創建的SNP進程的個數 JOB_QUEUE_PROCESSES 參數決定。

LCKn(Lock 鎖進程)
當採用 oracle 並行服務器選項時,多個 LCK 後臺進程(LCKn)用於解決內部實例的鎖定問題,有助於數據庫通信。LCK 進程的個數由 GC_LCK_PROCS 參數決定。

Dnnn(Dispatcher 調度程序進程)
調度進程是一個可選的後臺進程,僅在使用多線程服務器時出現,有助於減少處理多重連接所需要的資源。
對於數據庫服務器支持的每一個協議,必須至少創建一個調度程序進程。每個調度進程負責從所聯接的用戶進程到可用服務器進程的路由請求,並把響應返回到合適的用戶進程。調度程序進程根據 SQL*Net 或 Net8 的配置在數據庫啓動時創建,在數據庫打開後可以創建或取消。

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

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

 ORACLE 數據庫物理結構

ORACLE 數據庫的物理結構由以下四類文件組成:數據文件、日誌文件、控制文件、參數文件

數據文件(Data File)
數據文件是物理存儲 oracle 數據庫數據的文件,每一個 oracle 數據庫有一個或多個物理的數據文件。一個數據庫的所有數據文件包含了全部數據庫數據。邏輯數據庫結構(如表、索引)的數據物理地存儲在數據庫的數據文件中。

日誌文件(Redo Log File)
每一個數據庫有兩個或多個日誌文件,用於收集數據庫日誌。日誌的主要功能是記錄對數據所做的修改,所以對數據庫做的全部修改都是記錄在日誌中。
日誌文件的主要作用是保護數據庫以防止故障,其中的信息僅在系統故障或介質故障時用來恢復數據庫。爲了防止日誌文件本身的故障, oracle 允許鏡象日誌(mirrored redo log),可以在不同磁盤上維護兩個或多個日誌副本。
重做日誌以循環方式工作。例如用戶的數據庫有兩個聯機重做日誌:logA和logB,當事務創建、刪除以及修改數據庫中的數據時,它們首先被記錄在logA中,當logA填滿後即產生日誌交換(Log Switch),所有新的事務記錄到logB中;當logB填滿後,再產生一次日誌交換,所有新的事務又存放到logA中。因爲重做日誌以循環方式使用,因此 oracle 重用logA時,logA中的事務信息將被覆蓋。

ARCHIVELOG模式
當數據庫運行在 ARCHIVELOG 模式時,所有的事務重做日誌都將保存。這意味着對數據庫進行的所有事務都留有一個備份,儘管重做日誌以循環方式工作,但在一個重做日誌被覆蓋前均將爲其建立一個拷貝。
在這種方式下,如果在拷貝完成之前,數據庫要求交換重做日誌,則在重做日誌拷貝工作完成之前, oracle 將停止一切新的操作,在舊的事務記錄完成之前 oracle 不對其進行覆蓋。有了所有事務的拷貝,數據庫就可以從所有類型的失敗中恢復,包括用戶錯誤或磁盤崩潰。這是一種最安全的數據庫工作方式。

NOARCHIVELOG模式
在 NOARCHIVELOG 模式(系統缺省模式)下,系統不保留舊的重做日誌。因爲不是所有的事務記錄都能保留,因此用戶只能從諸如電源斷電這樣的事件中得到恢復(這種恢復也是有限的,因爲如果在一個記錄正好被填滿並進行交換時斷電,以前的信息將丟失)。
數據庫運行 NOARCHIVELOG 模式將不能在其覆蓋前保存重做日誌拷貝。NOARCHIVELOG 模式具有有限的恢復,主要被設計爲在例行故障時得到保護。

控制文件(Control File)
是一個二進制控制文件,記錄了數據庫中所有文件的控制信息,維護數據庫的全局物理結構,維護內部的完整一致性,並決定恢復數據時使用哪些重做日誌來引導恢復操作。
爲了安全起見,允許控制文件被鏡象。極力建議每個數據庫至少有兩個控制文件,並分別放在不同的磁盤上。
控制文件中包含了下列信息類型:
1、數據庫名
2、數據庫數據文件和日誌文件的名字和位置
3、數據庫建立日期
數據庫系統運行前要首先轉到控制文件,以檢查數據庫是否良好。如果 oracle 系統通過控制文件中的信息發現數據庫不正常,數據庫將不能正常運行。
每當出現數據庫檢查點(checkpoint)或者修改數據庫結構後,都要修改控制文件。如果沒有合法的控制文件,數據庫不能啓動。數據恢復時,也要使用控制文件。

參數文件(Parameter File)
oracle 將初始化參數存儲在一個初始化參數文本文件中,可直接使用文本編輯器對其內容進行修改。該文件只在建立數據庫和啓動實例時被訪問,修改該文件後必須重啓實例才能生效。
pfile(Parameter File)就是上面說的 oracle 傳統的初始化參數文件,而從 oracle 9i 開始,可以選擇在一個二進制的參數文件 spfile(Server Parameter File)中維護初始化參數。
spfile 通過 "CREATE SPFILE[=…] FROM PFILE=…" 語句由 pfile 生成,同樣 pfile 也可由 spfile 生成。
oracle 9i 啓動時默認的參數文件是 spfile,可通過 "STARTUP PFILE=…" 命令選擇從 pfile 讀取設置啓動。
參數文件作用如下:
1、設置SGA的大小
2、設置數據庫的全部缺省值
3、設置數據庫的範圍
4、在數據庫建立時定義數據庫的物理屬性
5、指定控制文件名和路徑
6、通過調整內存結構,優化數據庫性能

ORACLE 數據庫邏輯結構

ORACLE 數據庫存儲結構
一個表空間是由一個或多個物理數據文件組成
一個數據文件只可與一個表空間相聯繫
一個表空間由一組分類段組成
一個段由一組範圍組成
一個範圍由一批數據庫塊組成
一個數據庫塊對應一個或多個物理塊

數據庫塊(Database Block)
數據庫塊是 oracle 邏輯分配空間的最底層,又稱邏輯塊、數據塊、頁、oracle 塊。
數據庫塊是數據庫使用和分配空間的最小單元,也可以說是使用的最小 I/O 單元。
一個數據塊與磁盤上指定的物理空間大小相一致,一個數據庫塊對應一個或多個物理塊,塊的大小由參數 DB_BLOCK_SIZE 確定。

範圍(Extent)
數據庫存儲空間分配的邏輯單位,一個範圍由一組數據庫塊組成,範圍是由段分配的。分配的第一個範圍稱初始範圍,以後分配的範圍稱增量範圍。
範圍有如下特性:
1、一個或多個範圍構成一個段
2、當段增長時,範圍自動添加到段中
3、DBA可以手工把範圍加到一個段中
4、一個範圍不能跨數據文件,一個範圍只屬於一個數據文件
5、一個範圍由一片連續的數據庫塊構成
每個段在定義時有許多存儲參數來控制範圍的分配,主要是STORGAE參數,主要包括如下幾項:
1、INITIAL :分配給段的第一個範圍的字節數,缺省爲5個數據塊。
2、NEXT:分配給段的下一個增量範圍的字節數,缺省爲5個數據塊。
3、MAXEXTENTS :最大擴展次數。
4、PCTINCREASE:每一個增量範圍都在最新分配的增量範圍上增長,這個百分數缺省爲50%,建表時通常設置爲0,建表空間時爲1%。
範圍在分配時,遵循如下分配方式:
1、初始創建時,分配INITIAL指定大小的區。
2、空間不夠時,按NEXT大小分配第二個區。
3、再不夠時,按NEXT + NEXT *PCTINCREASE分配。

段(Segment)
段是表空間中一個指定類型的邏輯存儲結構,它由一個或多個範圍組成。段將佔用並增長存儲空間,但是一個段不能跨越表空間。
當執行建表命令時,系統將自動創建一個段,若沒有指定存儲參數子句 STORGAE,則系統會用相應表空間的 STORGAE,當初始區用完後,系統會按 NEXT 和 PCTINCREASE 的值分配新的區。
oracle 中段的類型有:數據段、索引段、臨時段、回滾段和啓動段(也叫自舉段)。

數據段(Data Segment)
可能存儲的對象類型包括:表、視圖、聚集、序列、同義詞、函數、存儲過程、觸發器等等。
每一個非聚集的表有一數據段,表的所有數據存放在該段中。每一聚集也有一個數據段,聚集中每一個表的數據存儲在該段中。

索引段(Index Segment)
每一個索引有一個索引段,存儲索引數據。

回滾段(Rollback Segment)
當某事務修改一個數據塊時,用以存放數據以前映像信息的數據段,以便保存讀連續性,並進行事務回滾和事務恢復。
例如:如果事務通過把一列的關鍵值從10改爲20來修改數據庫塊,則原值10要存放於回滾段中,而數據庫塊將具有新值20。如果事務被回滾,則值10從回滾段拷回數據庫塊。
事務產生的重做記錄保證在事務提交或回滾之前保持在回滾段中,而一個事務只能用一個回滾段存放其所有的重做記錄。因此回滾段大小需配置恰當,以免出現回滾段溢出。

臨時段(Temporary Segment)
當一個SQL語句需要臨時工作區時,由Oracle建立。當語句執行完畢後,臨時段的範圍退回給系統。
臨時段主要用於以下SQL操作:
1、CREATE INDEX
2、帶 DISTINCT、ORDER BY、GROUP BY、UNION 、INTERSECT、MINUS 子句的 SELECT 語句
3、無索引的 JOIN 語句
4、某些相互關聯的子查詢

啓動段(Bootstrap Segment)
存儲打開數據庫時要裝入的數據字典系統信息,放在系統表空間內。

表空間(Tablespace)
一個數據庫劃分爲一個或多個邏輯單位,該邏輯單位稱爲表空間(Tablespace),其中存儲了數據庫的所有數據。每個表空間由一個或多個稱爲數據文件(Datafile)的物理文件組成。
理解數據庫、表空間、數據文件、表、數據的最好辦法是想象一個裝滿東西的櫃子。數據庫就是櫃子,櫃中的抽屜是表空間,抽屜中的文件夾是數據文件,文件夾中的紙是表,寫在紙上的信息就是數據。表空間實質上就是組織數據文件的一種途徑。
一個表空間可將相關的邏輯結構組合在一起。表空間在邏輯上劃分爲段,段又進一步劃分爲範圍,範圍是連續的數據塊的集合。
下面列出一些典型的表空間名稱供參考,實際也可能並不這樣使用它們。
&說明:
在 oracle 中,用戶命名錶空間時有很大的自由度。
注意以下部分使用描述性的名字來爲每個表命名,此名字說明了它們要裝數據的類型。

系統表空間
系統表空間(System Tablespace)是每個 oracle 數據庫都必須具備的部分,在數據庫建立時自動建立。
在該表空間中包含有整個數據庫的系統信息數據,諸如表空間名稱、表空間所含數據文件這類管理數據庫自身所需的信息。
最小的數據庫可只需要系統表空間。

臨時表空間
臨時表空間(Temp Tablespace)是 oracle 用於存儲其所有臨時表。臨時表空間類似於數據庫白板或草稿紙:就像有時可能需要草草地記下一些數據以對其進行求和操作一樣, oracle 工作時也需要使用一些臨時的磁盤空間。
在一些非常繁忙的數據庫中,可能存在多個臨時表空間,例如 TEMP01、TEMP02、TEMP03 等等。

工具表空間
工具表空間(Tools Tablespace)用於保存數據庫工具軟件所需的數據庫對象,如 Oracle Reports(Oracle 的一個報表工具)這樣的工具軟件在工作時有自己的一組專用表,這些表就存放在數據庫的工具表空間中。

用戶表空間
用戶表空間(Users Tablespace)用於存放用戶的私有信息、專用數據庫對象。用戶表空間是DBA(數據管理員)許可用戶存放數據庫對象的地方。

數據及索引表空間
數據表空間(Data Tablespace)用於存放用戶的應用數據,一般命名爲 DATA 01、DATA02 等等。
索引表空間(Index Tablespace)則專門用於存放索引。
索引是專用的數據庫對象,可以幫助 oracle 迅速找出表中存放的數據。oracle 逐行檢索數據庫的方法稱爲全表掃描,利用索引的檢索則稱爲索引掃描。

回滾表空間
回滾表空間(Undo Tablespace)用於保存恢復(Undo)信息。回滾表空間中的恢復信息使用回滾段進行管理,這些回滾段由 oracle 自動生成和維護。在回滾表空間中不能創建其它類型的段。
自動恢復管理模式下,每個 oracle 實例需指定一個(只能是一個)回滾表空間。如果不使用自動恢復管理模式,則 oracle 使用 RBS 表空間作爲回滾表空間。
如果 oracle 實例沒有使用回滾表空間的話,恢復信息存儲在系統回滾段中。但一般不建議這樣做。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章