Oracle11gR2數據庫體系結構

一 .Oracle體系結構概述
體系結構是對一個系統框架的描述,是設計一個系統的宏觀工作。就如建造一座大樓的設計圖一樣,根據建築框架圖的要求,“嚴格”施工就可以建造一座功能完善,質量可靠的建築。即使大樓建好以後,我們依然可以根據設計圖來找到幾乎每一個功能部件。
數據庫系統結構設計了整個數據庫系統的組成部分和各部分組件的功能,這些組件各負其職,相互協調完成數據庫的管理和數據庫的維護工作。

二.Oracle數據庫體系結構
爲了滿足生產數據庫需求,Oracle設計瞭如下圖所示的體系結構,該體系結構包括實例(instance),數據文件(datafiles),用戶進程(User process),服務器進程(Server process)以及其他文件,如參數文件(Parameter file),密碼文件(Password file)和歸檔日誌文件(Archived log file)等等。
Oracle數據庫體系結構
其中,數據庫實例包括SGA(系統全局區)和一系列後臺進程,監控進程,數據庫包括三種文件:數據文件(Data files),控制文件(Control files)和重做日誌文件(Redo log files)。數據庫實例和數據庫是Oracle數據庫體系結構的核心部分,DBA很重要的工作就是維護數據庫實例和數據庫本身的正常工作。

2.1.Oracle服務器和實例
Oracle服務器和實例是非常重要的兩個概念,這裏的服務器不僅僅是物理概念,還包括系統進程,而實例則是DBA經常維護的對象。

  • Oracle實例(instance)
    Oracle實例就是由一些內存區和後臺進程組成。實例的組成如圖所示,從實例的組成圖可以看出實例由SGA和一些後臺進程組成,這些內存區包括數據庫高速緩存,重做日誌緩存,共享池,流池以及其他可選內存區(如java池),這些池也稱爲數據庫的內存結構。後臺進程包括系統監控進程(SMON),進程監控(PMON),數據庫寫進程(DBWR),日誌寫進程(LGWR),檢查點進程(CKPT),其他進程(如歸檔進程(ARCH),RECO進程等),這些數據庫系統進程相互協調完成數據庫管理任務。
    在這裏插入圖片描述
    要訪問數據庫必須先啓動實例,實例啓動時分配內存區,然後再啓動後臺進程,後臺進程執行數據庫的輸入,輸出以及監控其他Oracle進程。在數據庫啓動過程中有五個進程是必須啓動的,它們是系統監控進程(SMON),進程監控(PMON),數據庫寫進程(DBWR),日誌寫進程(LGWR),檢驗點進程(CKPT),否則實例無法創建。數據庫啓動過程我們可以在警告日誌(alertSID。ora)中看到詳細過程。

注意:
在實踐中,爲了方便會通過數據庫工具實現數據庫在計算機重啓時自動啓動,如果用戶安裝了其他佔用大量內存的應用軟件,可能會造成數據庫啓動失敗,此時往往是因爲內存不足,操作系統無法爲Oracle分配SGA。必須的五個進程也無法啓動。

  • Oracle服務器(server)
    Oracle服務器由數據庫實例和數據文件組成,它就是我們經常說的數據庫管理系統(DBMS).數據庫服務器組成如圖
    在這裏插入圖片描述
    數據庫服務器除了維護實例和數據文件外,還在用戶建立與服務器的連接時啓動服務器進程並分配PGA。

2.2.Oracle數據庫物理結構(文件組成)
我們都知道,數據庫是運行在操作系統之上的,數據庫的最終目的就是存儲和獲取相關的數據,這些數據實際存儲在操作系統文件中,這些操作系統文件組成Oracle數據庫物理結構。
Oracle數據庫的物理結構就是數據庫中的一系列操作系統文件,Oracle數據庫由3類文件組成。

  • 數據文件(data files):數據文件包含數據庫中的實際數據,是數據庫操作中數據的最終存儲位置。
  • 控制文件(control files):包含維護數據庫和驗證數據庫完整性的信息,它是二進制文件。
  • 重做日誌文件(redo files):重做日誌文件包含數據庫發生變化的記錄,在發生故障時用於數據恢復。

2.3參數文件,密碼文件和歸檔日誌文件
雖然參數文件,密碼文件和歸檔日誌文件不是Oracle的數據文件,但是Oracle數據庫不可少的3個文件。

  • 參數文件(parameter file):參數文件中定義了數據庫實例的特性。在參數文件中包含爲SGA中內存結構分配空間的文件,如分配數據庫高速緩衝區的大小等,參數文件是正文文件,可以使用操作系統文本編輯器查看。
  • 密碼文件(password file):密碼文件授予用戶啓動和關閉數據庫實例,在剛安裝數據庫時,Oracle的默認用戶名和密碼就存儲在密碼文件中,Oracle可以藉此判斷用戶的操作權限。
  • 歸檔日誌文件(archive log files):歸檔日誌文件是日誌文件的脫機備份,在發生故障後進行數據恢復時可能使用該文件。

三.數據庫連接與會話
連接與會話是Oracle數據庫容易混淆的兩個概念,它們是緊密相關的兩個概念。

3.1數據庫連接(connection)
連接指用戶進程與數據庫服務器之間的通信途徑,一個連接就可以有多個對話。Oracle提供了3種數據庫連接方式,如下

  • 基於主機的方式(Host-Based):此方式中,服務器和客戶端運行在同一臺計算機上,用戶可以直接連接數據庫服務器。
  • 基於客戶機-服務器方式(Client-Server):該方式中數據庫服務器和客戶端運行在不同的計算機上,客戶通過網絡連接至服務器,在DBA的日常維護中,會經常使用這種方法訪問數據庫,實現遠程維護。
  • 客戶-應用服務器-數據庫服務器方式(Client-Application Server-Server):這種方式叫作三層訪問模式,用戶首先訪問應用服務器,然後由應用服務器連接數據庫服務器,應用服務器就如一箇中介,完成客戶和數據庫的交互。在很多應用系統中,客戶的應用程序往往通過三層方式訪問數據庫,如應用服務器爲IIS或Apache服務器等。

3.2會話(session)
會話指一個明確的數據庫連接。用戶一旦採用三種連接方式之一去連接數據庫,就叫一個會話。
如果用戶通過某種工具(如SQL*Plus)在專用連接的情況下訪問數據庫,在輸入用戶名和密碼經服務器驗證後,服務器就會自動創建一個與該用戶進程相對應的服務器進程,二者是一對一的關係,這裏服務器進程就像用戶進程的代理,代替用戶進程向數據庫服務器發出各種請求,並把從數據庫服務器獲得的數據返回給用戶進程。
但用戶退出或發生異常時(操作系統重啓)會話結束。

注意:
剛纔指出“專有連接”的概念,專有連接是一種連接類型,指用戶和服務器進程之間是一對一的關係。而在共享服務器配置的情況下,多個用戶進程可以同時共享服務器進程,此時就不是專有連接,而是多對一的關係。

一個用戶可以併發建立多個會話,如下圖就是用戶	SYS同時在專有連接的情況下建立兩個會話的例子:

在這裏插入圖片描述
在上圖中的例子,我們同時使用兩個SQLPLUS工具連接數據庫,並且使用同一個用戶SYS,我們看到最後兩行顯示有兩個活躍(ACTIVE)的會話,一個是使用sqlplus.exe程序建立的,一個是使用sqlplusw.exe建立的。
說明:在上述查詢中,只是演示一個用戶可以建立多個連接,使用相同或者不同的工具登錄。至於v$session(數據字典視圖),我們暫且可以將它看作是一張表,表中存儲了當前會話的信息,如屬性USERNAME是用戶登錄名,屬性PROGRAM是用戶登錄工具(一個用戶進程)。
如圖展示了連接與會話之間的區別和聯繫
在這裏插入圖片描述
一個連接可以對應多個會話,連接僅僅是一種通信途徑,如果通過Socket建立通信,但是一個用戶可以啓動多個進程通過一個連接建立多個會話,這裏服務器進程就像是用戶進程的代理一樣,與服務器交互完成數據的各種操作。

四Oracle數據庫內存結構
Oracle的內存結構有兩大部分組成,一個是SGA,一個是PGA。PGA稱爲程序全局區,程序全局區不是實例的一部分,當服務器進程啓動時,才分配PGA。而SGA稱爲系統全局區,它是數據庫實例的一部分,當數據庫啓動時,會首先分配系統全局區,在系統全局區中包含幾個重要的內存區,數據庫高速緩衝區(Database buffer cache),重做日誌緩存(Redo log buffer cache),共享池(Shared pool),大池(Large pool)和Java池(Java pool)。

4.1共享池(Shared pool)
Oracle引入共享池的目的就是共享SQL或PL/SQL代碼,把解析得到的SQL代碼的結果在這裏緩存,其中PL/SQL代碼不僅在這裏緩存,同時在這裏共享。共享池由兩部分組成,庫高速緩存(Library cache)和數據字典高速緩存(Data dict cache),如下圖所示:
在這裏插入圖片描述

  • 庫高速緩存
    庫高速緩存存儲了最近使用過的SQL和PL/SQL語句。當然它的容量是有限的,Oracle採用一種LRU(least recently used)算法管理庫高速緩存,算法的基本思想是把一段時間內沒有被使用過的語句清除,一旦緩衝區填滿,算法把最近最少使用的執行計劃和解析樹從庫高速緩存中清除。顯然庫高速緩存設置得越大,就可以共享更多的SQL和PL/SQL代碼,但是Oracle並沒有設計直接設置庫高速的指令,只能通過設置共享池的大小間接地修改,而共享池是SGA的一部分,所以共享池不能超過SGA的大小。

設置共享池的大小:

SQL> alter system set shared_pool_size = 16M;

查看共享池的大小

SQL>show parameter shared_pool_size;
  • 數據字典高速緩存
    顧名思義,該緩存是與數據字典相關的一段緩衝區。在數據字典高速緩衝區中存儲了數據文件,表,索引,列,用戶,權限信息和其他一些數據庫對象的定義。在SQL語句的解析階段,數據庫服務器需要這些信息來解析用戶名和用戶的訪問權限。如果Oracle緩存了這些信息,無疑縮短了查詢響應時間。數據字典緩存也叫作字典緩存或者行緩存。
    同樣,數據字典高速緩存的大小取決於共享池尺寸的大小。如果設置太小,在查詢需要需要數據字典信息時,Oracle將不斷訪問數據字典表來獲得所需的信息,由於數據字典也是存儲在磁盤上的一類數據文件,頻繁的磁盤I/O無疑降低了數據庫的查詢速度。如果需要設置數據字典高速緩存的大小,需要通過設置參數shared_pool_size間接實現。

4.2數據庫高速緩衝區(Database buffer cache)
數據庫高速緩衝中存儲了最近從數據庫文件讀入的數據塊信息或用戶更改後需要寫回數據庫的數據信息,此時這些沒有提交給數據庫的更改後的數據稱爲髒數據。當用戶執行查詢語句如select * from dept時,如果用戶查詢的數據塊在數據庫高速緩衝區中,Oracle就不必從磁盤讀取,而是直接從數據庫高速緩存中讀取,顯然內存讀取的速度比物理讀取的速度快很多,這些緩存的數據由LRU算法管理。可見Oracle設計的各種緩存目的基本相同,就是提高查詢的響應速度。Oracle使用LRU算法管理數據庫緩衝區,把最近沒有使用的數據庫從高速緩存中刪除,爲其他的查詢數據塊保留空間。
Oracle使用參數DB_BLOCK_SIZE和DB_BLOCK_BUFFERS設置庫高速緩存的大小,DB_BLOCK_SIZE是Oracle數據塊的大小,而DB_BLOCK_BUFFERS是數據庫的個數,二者的乘積就是庫高速緩存的大小。

查詢數據庫塊的大小

SQL>show parameter db_block_size;

注意:用這種方式設置數據庫高速緩存的大小需要重啓數據庫才能生效,db_block_size的值是8192B。

在Oracle9i及以上版本中提供了一個DB_CACHE_SIZE參數來設置Oracle數據庫高速緩存區的大小,該參數可以動態更改,之後可以通過查詢指令查看更改後的參數。

查詢數據庫高速緩存的大小

SQL>show parameter db_cache_size;l

因爲在Oracle11g中,SGA爲數據庫服務器自動管理,所以該參數值爲0,當然在運行Oracle11g數據庫時,數據庫高速緩存一定已分配好,我們可以使用show sga指令查看數據庫高速緩衝區的分配的內存大小。

查詢數據庫高速緩存的的大小

SQL>show sga;

雖然在Oracle11g中數據庫高速緩存的大小自動管理,但是用戶可以設置該數據庫組件的大小
動態設置數據庫高速緩衝區大小

SQL>alter system set db_cache_size = 200M;

在Oracle中引入了Buffer Cache Advisory Parameter參數,其目的是讓Oracle對於數據庫緩衝區的內存分配提供一些建議。
下面介紹緩衝區顧問參數的作用,緩衝區顧問用於啓動或關閉統計信息,這些信息用於預測不同緩衝區大小導致的不同行爲特性。對於DBA可以參考這些統計信息,基於當前的數據庫工作負載設置優化的數據庫高速緩存。

緩存顧問通過初始化參數DB_CACHE_ADVICE啓動或關閉顧問功能,該參數有3個狀態。

  • OFF:關閉緩存顧問,不分配緩存顧問的工作內存。
  • ON:打開緩存顧問,分配工作內存。
  • READY:打開緩存顧問,但不分配緩存顧問的工作內存。

關閉數據庫高速緩存顧問的狀態

SQL>alter system set db_cache_advice = off;

查看數據庫高速緩存顧問的狀態

SQL>show parameter db_cache_advice;

在設置緩存顧問爲開啓狀態時,Oracle開始統計與設置數據庫緩存相關的建議信息,可以通過動態性能視圖v$DB_CACHE_ADVICE查看緩衝區的建議信息。

查看與設置數據庫高速緩衝區相關的信息

SQL>col id for 99
SQL>SELECT id,name,block_size,size_for_estimate,buffers_for_estimate from v$db_cache_advice;

4.3重做日誌高速緩衝區(Redo buffer cache)
當用戶執行了如INSERT,UPDATE;DELETE,CREATE,ALTER或DROP操作後,數據發生了變化,這些變化了的數據在寫入數據庫高速緩存之前會先寫入重做日誌緩衝區(日誌寫優先原則),同時變化之前的數據也放入重做日誌高速緩存,這樣在數據恢復時Oracle就知道哪些需要前滾哪些需要後滾了。
重做日誌緩衝區的大小是可以動態調節的,在數據運行期間修改這塊內存的大小,Oracle提供了一個初始化參數LOG_BUFFER,在數據庫實例啓動時就分配好重做日誌緩衝區的大小。

查看重做日誌緩衝區

SQL>show parameter log_buffer;

注意:重做日誌緩衝區參數log_buffer是靜態參數,不能動態修改,如果嘗試修改會報錯ORA-02095。

4.4大池(Large pool)和Java池(Java pool)
大池是SGA的一段可選內存,只在共享服務器環境中配置大池。在共享服務器環境下,Oracle在共享池中分配額外的空間用於存儲用戶進程和服務器進程之間的會話信息,但是用戶進程區域UGA(可理解爲PGA在共享服務器中另一個稱呼)的大部分將在大池中分配,這樣就減輕了共享池的負擔。在大規模輸入,輸出及備份過程中也需要大池作爲緩存空間。
Oracle提供了參數large_pool_size參數設置大池的尺寸。

查看大池的大小

SQL>show parameter large_pool_size;

參數large_pool_size是動態參數,也可以通過alter system指令修改該參數的值,語句格式爲:

SQL>alter system set large_pool_size = 48M;

Java池也是可選的一段內存區,但是在安裝完Java或者使用Java程序時則必須設置Java池,它用於編譯Java語言編寫的指令。Java語言與PL/SQL語言在數據庫中有相同的存儲方式。Oracle提供了參數JAVA_POOL_SIZE設置Java池大小。、

查看java池的大小

SQL>show parameter java_pool_size;

說明:在Oracle11g中,Java池大小由數據庫服務器在SGA中自動分配,當然用戶也可以使用alter system指令修改該參數值,如果該參數值爲0,則說明開啓自動管理。

4.5流池(Streaming pool)
流池也稱爲流內存,它是Oracle流專用的內存池,流(stream)是Oracle數據庫中的一個數據共享,其大小可以通過參數stream_pool_size動態調整。

4.6進程全局區(PGA)和用戶全局區(UGA)
進程全局區是服務器進程專用的一塊內存,它是操作系統進程專用的內存,系統中的其他進程是無法訪問這塊內存的。PGA獨立於SGA,PGA不會在SGA中出現,它是由操作系統在本地分配。

1.PGA(進程全局區)
PGA中存儲了服務器進程或單獨的後臺進程的數據信息和控制信息。它隨着服務器進程的創建而分配內存,隨着進程的終止而釋放內存。PGA與SGA不同,它不是一個共享區域,而是服務器進程專有區域。在專有服務器配置中包括如下組件:

  • 排序區:對某些的SQL語句執行結果進行排序。
  • 會話信息:包含本次會話的用戶權限和性能統計信息。
  • 遊標狀態:標明當前會話執行的SQL語句的處理階段。
  • 堆棧區:包含其他會話變量。

注意:在共享服務器配置中,多個用戶進程共享一個服務器進程,上述的一些內存區可能在SGA中分配。如果創建了大池,這些內存結構就存儲在大池中,否則它們存儲在共享池中。

專有服務器模式下的PGA結構
在這裏插入圖片描述
共享服務器模式下的PGA結構
在這裏插入圖片描述
注意:在共享服務器結構中,會話信息是存儲在SGA中的,兩種模式下堆棧區(Stack space)都存儲在PGA中。

2.用戶全局區(UGA)
在共享服務器模式下有一個重要的概念即UGA(用戶全局區),它是用戶的會話狀態,這部分內存會話總可以訪問,UGA存儲在每個共享服務器都可以訪問的SGA中,這樣任何服務器都可以使用用戶會話的數據和其他信息。而在專有服務器模式下,用戶會話狀態不需共享,用戶進程與服務器進程是一一對應的關係,所以UGA總是在PGA中進行分配。

3.PGA內存管理
從Oracle9i開始,Oracle提供了兩種方法管理PGA,即手動PGA管理和自動PGA管理。採用手動管理時,必須告訴Oracle一個特定的進程需要的排序區,允許使用多少內存,而在自動PGA管理中,則要求告訴Oracle在系統範圍內可以爲PGA中的特定功能如排序區分配多少內存。

查詢PGA中排序區的大小

SQL>show parameter sort_area_size;

在服務器進程最初查詢時,會用512KB內存實現數據排序,在Oracle將排序數據處理完畢之前,數據排序區的大小就由參數sort_area_size決定。

注意:在Oracle10g和Oracle11g中可實現共享服務器連接時PGA的自動管理,而在Oracle9i中,使用共享服務器連接時只能使用手動PGA管理。

4.7如何獲取內存緩衝區的信息
SGA是Oracle中所有進程共享的一段內存區,其中共享了數據庫信息如數據庫高速緩衝區中的數據,共享池中的庫高速緩存中的SQL語句等。瞭解這些內存緩衝區的大小有助於理解Oracle的內存分配情況。

查看SGA中內存的分配情況
在這裏插入圖片描述
在上述輸出中可以看到,SGA,Database Buffers和Redo Buffers的大小,前面已經瞭解了這些內存組件的作用。你或許注意到Fixed Size和Variable Size兩個參數,它們和兩個內存區有關,下面解釋這兩個內存區:

  • 固定SGA(和fixed size相關):在固定SGA中,存儲一組指向SGA中其他組件的變量。它的內存大小用戶無法控制,因平臺不同而有差異。但通常固定SGA區很小。Oracle使用這個內存區來尋找其他SGA區,可以理解爲數據庫的自舉區。
  • 和Variable Size相關的內存區。該部分內存區包括共享池,Java池和大池,其中Variable Size的大小要高於上述3個內存結構之和,因爲在Total SGA中除去db_cache_size部分也包括在Variable Size中。

查看SGA的大小

SQL>show parameter sga_max_size;

說明:在Oracle11g中該參數的值得到修正而使用MB作爲單位,更利於識別,而在Oracle10g版本中參數sga_max_size的值使用字節爲單位。

4.5Oracle服務器進程和用戶進程
服務器進程和用戶進程,是用戶使用數據庫連接工具同數據庫服務器建立連接時,涉及的兩個概念。

  • 服務器進程:服務器進程猶如一箇中介,完成用戶的各種數據服務請求,而把數據庫服務器返回的數據和結果返回給用戶端。在專有連接中,一個服務器進程對應一個用戶進程,二者是一一對應關係。當用戶連接中斷,則服務器程序中斷,則服務器程序退出;在共享連接中,一個服務器進程對應幾個用戶進程,此時服務器進程通過OPI(Oracle Program Iterface)與數據庫服務器通信。
  • 用戶進程:當用戶使用數據庫工具如SQLPlus與數據庫服務器建立連接時,就啓動了一個用戶進程,即SQLPlus軟件進程。

使用SCOTT用戶連接數據庫

SQL>conn scott/tiger@orcl

此時,用戶和數據庫服務器建立了連接,數據庫服務器產生一個服務器進程,負責與數據庫服務器的直接交互。

4.6Oracle數據庫後臺進程
後臺進程是在實例啓動時,在數據庫服務器端啓動的管理程序,它使數據庫的內存結構和數據庫物理結構之間協調工作。從功能上考慮,在數據庫內存結構,後臺進程和數據庫物理結構之間的關係如圖所示:
在這裏插入圖片描述
數據庫後臺進程有五個是必須啓動的,否則數據庫實例無法啓動。它們是DBWR,LGWR,PMON,SMON,和CKPT。
1.系統監控進程(SMON)
系統監控進程的主要作用就是數據庫實例恢復。當數據庫發生故障時,如操作系統重啓,此時實例SGA中的所有沒有寫到磁盤的信息都將丟失。當數據庫重新啓動後,系統監控進程自動恢復實例。實例的恢復包括如下3個步驟:

  • 前滾所有沒有寫入數據文件而記錄在重做日誌文件中的數據。此時,系統監控進程讀取重做日誌文件,把用戶更改的數據重新寫入數據塊。
  • 打開數據庫,此時或許系統監控進程的前滾操作還沒完成,Oracle這樣做的目的就是方便用戶登錄,以免前滾時間太長,影響用戶的行爲,這樣用戶就可以操作那些沒有被事務恢復鎖住的數據。
  • 回滾未提交的事務

除此之外,系統監控進程執行某些空間維護的作用。

  • combine,coalesces,adjacent數據文件中的自由空間。
  • 回收數據文件的臨時段。

2.進程監控進程(PMON)
進程監控負責服務器進程的管理和維護工作,在進程失敗或連接異常發生時該進程負責一些清理工作。

  • 回滾沒有提交的事務
  • 釋放所持有的當前的表或行鎖。
  • 釋放進程佔用的SGA資源。
  • 監視其他Oracle的後臺進程,在必要時重啓這些後臺進程。
  • 向OracleTNS監聽器註冊剛啓動的實例。如果監聽器在運行,就與這個監聽器通信並傳遞如服務名和實例的負載等參數;如果監聽器沒有啓動,進程監控(PMON)會定期地嘗試連接監聽器來註冊實例。

3.數據庫寫進程(DBWR)
在介紹高速緩衝區時,提到了髒數據的概念,髒數據就是用戶更改了的但沒有提交的數據庫中的數據,因爲在數據庫的數據文件與數據庫高速緩存中的數據不一致,故稱作髒數據,這種髒數據必須在特定的條件下寫到數據文件中,這就是數據庫寫進程的作用。
數據庫寫進程負責把數據庫高速緩衝區中的髒數據寫到數據文件中。或許您會問爲什麼不立即提交髒數據,這樣就不需要複雜的數據庫寫進程來管理。其實,Oracle這樣設計的思路很簡單,就是減少磁盤I/O次數,但髒數據量達到一定程度或者某種其他條件滿足時,就提交一次髒數據。因爲磁盤的輸入,輸出會花費系統時間,使得Oracle系統的效率不高。
下圖是數據庫寫進程“實體”關係
在這裏插入圖片描述
當一個事件發生時,會觸發數據庫寫進程把髒數據寫到數據庫的數據文件中:

  • 發生檢查點事件。
  • 髒數據量達到了門限值。
  • 數據庫緩衝區沒有足夠的緩存爲其他事務提供足夠的空間。
  • 表空間處於熱備份狀態。
  • 表空間被置爲離線狀態。
  • 表空間備置爲只讀狀態。
  • 刪除表或者截斷表。
  • 超時。

注意:數據庫寫進程的性能很重要,如果它寫髒數據到數據文件很慢,使大量緩衝區無法釋放,就會出現一些等待事件,如Free Buffer Waits等。實際在Oracle數據庫上,一個數據庫實例可以啓動多個數據庫寫進程,在多CPU系統可以使用多個數據庫寫進程來分擔單個寫進程的工作負載。

4.重做日誌寫進程(LGWR)
重做日誌寫進程負責將重做日誌緩衝區中的數據寫到重做日誌文件。此時重做日誌緩衝區中的內容是恢復事務所需的信息,比如用戶使用UPDATE語句更新了某行數據,恢復事務所需的信息就是更新的數據和更新後的數據,這些信息用於該事務的恢復。
重做日誌寫進程在滿足一個條件時,會啓動進程工作:

  • 當事務提交時。
  • 當重做日誌緩衝區的1/3被佔用時。
  • 當重做日誌緩衝區有1MB的數據時。
  • 當數據庫進程把髒數據寫到數據文件之前。

下圖展示重做日誌寫進程工作流程:
在這裏插入圖片描述
注意:從上圖可以看出,日誌寫進程會通知數據庫寫進程將髒數據寫到數據文件,但是數據庫寫進程不會把髒數據寫到在線重做日誌,也不會通知日誌寫進程做任何事。

數據庫寫進程是離散寫到不同數據庫文件上的,在執行一個更新時,數據庫寫進程會修改不同空間中存儲的數據塊和索引塊,所以數據庫寫進程的離散寫的速度很慢。而重做日誌寫進程是順序寫,它比離散寫的效率高,把每個事務的重做信息全部放在重做日誌中。通過在數據庫高速緩存中緩存髒數據塊,而由重做日誌寫進程完成大規模順序寫,從整體上提高系統的性能。

5.歸檔日誌進程(ARCH)
歸檔日誌進程是可選進程,該進程並不在實例啓動時自動啓動。它的作用是把寫滿的重做日誌文件的數據寫到一個歸檔日誌中,這個歸檔日誌用作介質故障時的數據庫恢復。
在這裏插入圖片描述
重做日誌文件負載實例失敗時的數據恢復,因爲SGA中沒有被保存的數據會全部丟失,這樣使用重做日誌文件就可以完全恢復事務。而歸檔日誌進程用於介質恢復,比如磁盤損壞,可以使用以前備份的數據文件,使用歸檔日誌和重做日誌可以完全恢復數據庫。
歸檔進程不在實例啓動時自動啓動,在生產數據庫中必須使用歸檔模式,以防止災難性的數據損壞。

查看系統的歸檔模式
在這裏插入圖片描述
如果沒有啓動歸檔模式,需要先關閉數據庫,以MOUNT參數啓動數據庫,更改後再啓動到OPEN狀態即可。
在這裏插入圖片描述
查看當前數據庫的歸檔模式
在這裏插入圖片描述
數據庫的日誌模式改爲歸檔模式,自動存檔已啓動,歸檔日誌的存儲目錄即存檔終點是數據庫恢復文件目錄。

查看數據庫恢復目錄的位置
在這裏插入圖片描述
參數db_recovery_file_dest的value爲F:\app\Administrator\flash_recovery_area,說明了數據庫恢復文件目錄的位置,而參數db_recovery_file_dest_size的value值爲2GB說明該存儲目錄分配的磁盤空間大小。

6.檢驗點進程(Checkpoint process)
檢驗點是一個事件,當數據庫寫進程把SGA中所有被修改了的數據庫高速緩衝中的數據寫到數據文件上時產生,這些被修改的數據包括提交的和未提交的數據。由於引入了檢驗點,使得所有的檢驗點的所有變化了的數據都寫到數據文件中,在實例恢復時,就不必恢復檢驗點之前的重做日誌中的數據,加快了系統恢復效率。

  • 檢驗點進程要將檢驗點號碼寫入相關的數據文件的頭文件中。
  • 檢驗點進程把檢驗點號碼,SCN號,重做日誌序列號,歸檔日誌名字等都寫入控制文件。
    下圖展示檢驗點進程工作流程
    在這裏插入圖片描述
    Oracle提供一個指令,用戶可以強制產生檢驗點,使得用戶可以干預檢驗點的產生

強制產生檢驗點

SQL>alter system checkpoint;
發佈了61 篇原創文章 · 獲贊 92 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章