萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構

資料和雲發表於2019-04-23

學習是一個循序漸進的過程,從面到點、從宏觀到微觀,逐步滲透,各個擊破,對於Oracle, 怎麼樣從宏觀上來理解呢?先來看一個圖,這個圖取自於教材,這個圖對於從整體上理解ORACLE 的體系結構元件,非常關鍵。

首先看張圖:


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


對於一個資料庫系統來說,假設這個系統沒有執行,我們所能看到的和這個資料庫相關的無非就是幾個基於作業系統的物理檔案,這是從靜態的角度來看,如果從動態的角度來看呢,也就是說這個資料庫系統執行起來了,能夠對外提供服務了,那就意外著資料庫系統啟動了自己的一個例項,綜合以上2個角度,Oracle如何定義上述描述呢?

我們來引入第一個概念,Oracle伺服器,所謂Oracle伺服器是一個資料庫管理系統,它包括一個Oracle例項(動態)和一個Oracle資料庫(靜態)。Oracle例項是一個執行的概念(如作業系統的程式),提供了一種訪問,Oracle資料庫的方式,始終開啟一個,並且只能開啟一個Oracle資料庫,Oracle例項有SGA和一些後臺服務程式組成,在後臺服務程式當中,DBWn PMON CKPT LGWR SMON是必備的後臺程式,而ad queue、rac、shared server、ad replication則是可選的,之所以可選,要們是因為離開它Oracle也能正常執行,要麼是一些高階的功能才可以用得到。

Oracle資料庫是一個被統一處理的的資料的集合,從物理角度來看包括三類檔案資料檔案,控制檔案,重做日誌檔案。從邏輯角度來看,Oracle資料庫至少包含一個表空間,表空間至少包含一個段,段由區做成,區有塊組成。需要注意的是表空間可以包含若干個資料檔案,段可以跨同一個表空間的多個資料檔案,區只能在同一個資料檔案內。

Oracle還設計了其他的關鍵檔案用來為整個系統服務,如配置檔案、密碼檔案、歸檔日誌檔案,還有還有使用者程式和服務程式,現在可以簡單理解下執行SQL語句就要用到這2個程式。

下表是後臺程式總結

最後,舉一個使用者提交SQL語句的的例子來結束本文,如果使用者想提交SQL語句,那麼首先你必須要連線到Oracle例項,連線到Oracle例項有三種途徑:如果使用者登陸到執行Oracle例項的作業系統上,則透過程式間通訊進行訪問2C/S結構訪問3三層結構。發起連線的應用程式或工具通常稱為使用者程式,連線發起後,Oracle伺服器就會建立一個程式來接受連線,這個程式就成為服務程式,伺服器程式代表使用者程式與Oracle例項進行通訊,在專用伺服器連線模式下,使用者程式和服務程式是1對1的關係,在共享伺服器模式下,多個使用者程式可能共享一個服務程式。當伺服器程式開始和Oracle例項進行通訊時,一個會話就被建立了。顯然處理一個查詢要經過語法分析、繫結、執行、提取等階段。

Oracle的基礎架構知識

筆者在學習Oracle之前,特地先去了解了OracleDB的框架。這樣對Oracle資料庫有一個整體的認知,有由高屋建領地的作用。磨刀不誤砍菜功吧。Oracle資料庫主要由一下5部分組成:


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構

1. 物理結構

Oracle物理結構由控制檔案、資料檔案、重做日誌檔案、引數檔案、歸檔檔案、口令檔案組成

一個資料庫中的資料儲存在磁碟上物理檔案,被使用時,調入記憶體。其中控制檔案、資料檔案、重做日誌檔案、跟蹤檔案及警告日誌(trace files、alert files)屬於資料庫檔案;引數檔案(parameter file)口令檔案(password file)是非資料庫檔案。

  • 資料檔案:儲存資料的檔案.資料檔案典型地代表了根據他們使用的磁碟空間和數量所決定的一個Oracle資料庫的容積。

        於此我們需要知道的是,一個資料庫中的資料是儲存在磁碟上的物理檔案,被使用時才被調入記憶體中的。其中控制檔案、資料檔案、重做日誌檔案、跟蹤檔案、警告檔案屬於資料庫檔案。引數檔案、口令檔案屬於非資料庫檔案。

  • 控制檔案:包含維護和驗證資料庫完整性的必要資訊、例如,控制檔案用於識別資料檔案和重做日誌檔案,一個資料庫至少需要一個控制檔案。控制檔案內容有:

    • 資料庫名

    • 表空間資訊

    • 所有資料檔案的名字和位置

    • 所有redo日誌檔案的名字和位置

    • 當前的日誌序列號

    • 檢查點資訊

    • 關於redo日誌和歸檔的當前狀態資訊

        控制檔案的使用過程是控制檔案把Oracle引導到資料庫檔案的其它部分。啟動一個例項時,Oracle從引數檔案中讀取控制檔案的名字和位置。安裝資料庫時,Oracle開啟控制檔案。最終開啟資料庫時,Oracle從控制檔案中讀取資料檔案的列表並開啟其中的每個檔案。

  • 重做日誌檔案,含對資料庫所做的更改記錄,這樣萬一出現故障可以啟用資料恢復。一個資料庫至少需要兩個重做日誌檔案。

  • 跟蹤檔案及警告日誌(Trace Files and Alert Files),

    • 跟蹤檔案是在instance 中執行的每一個後臺程式都有一個跟蹤檔案(trace file)與之相連。Trace file記載後臺程式所遇到的重大事件的資訊。

    • 警告日誌( Alert Log)是一種特殊的跟蹤檔案,每個資料庫都有一個跟蹤檔案,同步記載資料庫的訊息和錯誤。

  • 引數檔案:包括大量影響Oracle資料庫例項功能的設定,如以下設定:

    • 資料庫控制檔案的定位

    • Oracle用來快取從磁碟上讀取的資料的記憶體數量

    • 預設的最佳化程式的選擇

        和資料庫檔案相關,執行兩個重要的功能,為資料庫指出控制檔案和為資料庫指出歸檔日誌的目標。

  • 歸檔檔案:是重做日誌檔案的離線副本,這些副本可能對於從介質失敗中進行恢復很必要。

  • 口令檔案:認證哪些使用者有許可權啟動和關閉Oracle例程.

2. 邏輯結構(表空間、段、區、塊)

  • 表空間:是資料庫中的基本邏輯結構,一系列資料檔案的集合。

  • 段:是物件在資料庫中佔用的空間.

  • 區:是為資料一次性預留的一個較大的儲存空間.

  • 塊:ORACLE最基本的儲存單位,在建立資料庫的時候指定.

3. 記憶體分配(SGA和PGA)

  • SGA:是用於儲存資料庫資訊的記憶體區,該資訊為資料庫程式所共享。它包含Oracle伺服器的資料和控制資訊,它是在Oracle伺服器所駐留的計算機的實際記憶體中得以分配,如果實際記憶體不夠再往虛擬記憶體中寫。

  • PGA:包含單個伺服器程式或單個後臺程式的資料和控制資訊,與幾個程式共享的SGA正相反,PGA 是隻被一個程式使用的區域,PGA在建立程式時分配,在終止程式時回收.

4. 後臺程式

包括資料寫程式(Database Writer,DBWR)、日誌寫程式(Log Writer,LGWR)、系統監控(System Monitor、SMON)、程式監控(Process Monitor、PMON)、檢查點程式(Checkpoint  Process、CKPT)、歸檔程式、服務程式、使用者程式。

  • 資料寫程式:負責將更改的資料從資料庫緩衝區快取記憶體寫入資料檔案

  • 日誌寫程式:將重做日誌緩衝區中的更改寫入線上重做日誌檔案

  • 系統監控:檢查資料庫的一致性如有必要還會在資料庫開啟時啟動資料庫的恢復

  • 程式監控:負責在一個Oracle 程式失敗時清理資源

  • 檢查點程式:負責在每當緩衝區快取記憶體中的更改永久地記錄在資料庫中時,更新控制檔案和資料檔案中的資料庫狀態資訊。該程式在檢查點出現時,對全部資料檔案的標題進行修改,指示該檢查點。在通常的情況下,該任務由LGWR執行。然而,如果檢查點明顯地降低系統效能時,可使CKPT程式執行,將原來由LGWR程式執行的檢查點的工作分離出來,由CKPT程式實現。對於許多應用情況,CKPT程式是不必要的。只有當資料庫有許多資料檔案,LGWR在檢查點時明顯地降低效能才使CKPT執行。CKPT程式不將塊寫入磁碟,該工作是由DBWR完成的。  init.ora檔案中CHECKPOINT_PROCESS引數控制CKPT程式的使能或使不能。預設時為FALSE,即為使不能。

  • 歸檔程式:在每次日誌切換時把已滿的日誌組進行備份或歸檔

  • 服務程式:使用者程式服務。

  • 使用者程式:在客戶端,負責將使用者的SQL語句傳遞給服務程式,並從伺服器段拿回查詢資料。

5. SCN(System ChangeNumber):

  • 系統改變號,一個由系統內部維護的序列號。當系統需要更新的時候自動增加,他是系統中維持資料的一致性和順序恢復的重要標誌。

Oracle架構實現原理、含五大程式解析

Oracle架構,講述了Oracle RDBMS的底層實現原理,是Oracle DBA效能調優和排錯的基礎理論。深入理解Oracle架構,能夠讓我們在Oracle的路上走的更遠。本章節主要是在對RDBMS的底層元件功能和實現原理有一定的瞭解的情況下,結合自身的工作經驗提出了對Oracle調優和排錯的思路。當然,對Oracle體系結構的理解是一個深遠的過程,需要不斷的更新修改。


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構

Oracle RDBMS架構圖

一般我們所說的Oracle指的是Oracle RDBMS(Relational databases Management system),一套Oracle資料庫管理系統,也稱之為Oracle Server。而Oracle Server主要有兩大部分:Oracle Server = 例項 + 資料庫(Instance和Database是相互獨立的)。

  • 資料庫 = 資料檔案 + 控制檔案 +日誌檔案

  • 例項 = 記憶體池 + 後臺程式

所以可以細分為:Oracle Server = 記憶體池 + 後臺程式 + 資料檔案 + 控制檔案 + 日誌檔案

一臺Oracle  Server支援建立多個Database,而且每個Datacase是互相隔離而獨立的。不同的Database擁有屬於自己的全套相關檔案,例如:有各自的密碼檔案,引數檔案,資料檔案,控制檔案和日誌檔案。

Database由一些物理檔案(如:存放在儲存裝置中的二維表檔案)組成。二維表儲存在Database中,但Database的內容不能被使用者直接讀取,使用者必須透過Oracle instance才能夠訪問Database,一個Instance只能連線一個Database,但是一個Database可以被多個Instance連線。

將上面的Oracle RDBMS架構圖進行抽象分類,可以將Oracle架構抽象為:Oracle體系 = 記憶體結構 + 程式結構 + 儲存結構

萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構                          

記憶體結構

Oracle Instance是Oracle RDBMS的核心之一,負責RDBMS的管理功能。Oracle Instance主要由記憶體池SGA和後臺程式組成。

萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構

系統全域性區SGA

萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構

Oracle的架構不是很難也不是很容易,認真學肯定能學會。

記憶體池SGA的預設Size,會在安裝Oracle的時候會根據LinuxOS的sysctl.conf引數檔案來決定:


kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 1048576
net.core.rmem_max = 1048576
net.core.wmem_default = 262144
net.core.wmem_max = 262144

檢視SGA的Size:

SQL> conn /as sysdba

Connected.

SQL> show user;

USER is "SYS"SQL> select * from v$sga;

NAME              VALUE

-------------------- ----------

Fixed Size      2022144

Variable Size         503317760

Database Buffers     1627389952

Redo Buffers           14753792
SQL> show sga

Total System Global Area 2147483648
bytes     #對應kernel.shmmax = 2147483648

Fixed Size          2022144 bytes

Variable Size         503317760 bytes

Database Buffers     1627389952 bytes

Redo Buffers           14753792 bytes


SGA(System Global Area)是與Oracle效能關係最大的核心部分,也是對Oracle進行調優的主要考量。SGA記憶體池會在Instance啟動時被分配,在Instance關閉時被釋放。在一定範圍內,SGA可以在Instance執行時透過自動方式響應DBA的指令。如果想對SGA進行調優還必須理解SGA所包含如下幾種資料結構:


快取記憶體緩衝區(資料庫緩衝區)——oracle執行SQL語句的區域。

例如在更新資料時,使用者執行的SQL語句不會直接對磁碟上的資料檔案進行更改操作,而是首先將資料檔案複製到資料庫緩衝區快取(就是說資料庫緩衝區裡會存放著SQL相關資料檔案副本),再更改應用於資料庫緩衝區快取中這些資料塊的副本。而且資料塊副本將在快取中保留一段時間,直至其佔用的緩衝區被另一個資料庫覆蓋為止(緩衝區Size有限)。

在查詢資料時,為了提高執行效率,查詢的資料也要經過快取。建立的Session會計算出那些資料塊包含關鍵的行,並將它們複製到資料庫緩衝區中進行快取。此後,相關關鍵行會傳輸到Session的PGA作進一步處理。這些資料塊也會在資料庫快取區快取中保留一段時間。

一般情況下,被頻繁訪問的資料塊會存在於資料庫緩衝區快取中,從而最大程度地減少對磁碟I/O的需要。

那什麼時候會將被更新的資料塊副本寫入到磁碟中的資料檔案呢?


答案:如果在緩衝區快取中儲存的資料塊與磁碟上的資料塊不同時,那麼這樣的緩衝區常稱為”髒緩衝區”,髒緩衝區中的資料塊副本就必須寫回到磁碟的資料檔案中。

調優:資料庫緩衝區快取的大小會對效能產生至關重要的影響,具體需要多大的Size才能成為最佳配比還要結合實際的生產環境而言。總體而言可以依據以下兩點基本要求來判斷:


1. 快取應足夠大,以便能快取所有被頻繁訪問的資料塊。如果快取過小,那麼將導致磁碟I/0活動過多,因為頻繁訪問的資料塊持續從磁碟讀取,並由其他資料塊使用和重寫,然後再從磁碟讀取。
2. 但也不能太大,以至於它會將極少被訪問的塊也一併加入到快取中,這樣會增長在快取中搜尋的時間。

資料庫緩衝區快取在Instance啟動時被分配。從資料庫9i開始,可以隨時將其調大或調小。可以採用手動方式重調,也可以根據工作負荷自動重調大小(事務)。
修改緩衝區DB_CACHE_SIZE地方法:

#Step1. 檢視SGA的大小:因為DB_CACHE_SIZE的size受SGA的影響

SQL> show parameter sga_max_size;NAME                     TYPE    VALUE

------------------------------------ ----------- ------------------------------

sga_max_size                 big integer 2G


#Step2. 檢視show parameter shared_pool_size的大小

SQL> show parameter shared_pool_size;                  
NAME                     TYPE    VALUE

------------------------------------ ----------- ------------------------------

shared_pool_size             big integer 0
#Step3. 計算DB_CACHE_SIZE的大小:shared_pool_size + db_cache_size = SGA_MAX_SIZE * 70%
#Step4. 修改DB_CACHE_SIZE的大小

SQL> alter system set db_cache_size=1433M scope=spfile sid='demo';
System altered.
SQL> conn sys /as sysdba

Enter password: ********

Connected.

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.
Total System Global Area 2147483648 bytes

Fixed Size          2022144 bytes

Variable Size         503317760 bytes

Database Buffers     1627389952 bytes

Redo Buffers           14753792 bytes

Database mounted.Database opened.

SQL> show parameter db_cache_size


日誌緩衝區

日誌緩衝區是小型的、用於短期儲存將寫入到磁碟上的重做日誌的變更向量的臨時區域。主要作用是提供更加快的日誌處理效率。


共享池

共享池的大小也對效能產生重要影響:


1. 它應該足夠大,以便快取所有頻繁執行的程式碼和頻繁訪問的物件定義。如果共享池過小,則效能下降,因為伺服器會話將反覆搶奪其中的空間來分析語句,此後,這些語句會被其他語句重寫,在重新執行時,將不得不再次分析。如果共享池小於最優容量,則效能將下降。但有一個最小容量,如果低於此限度,則語句將失敗。
2. 但也不能過大,以至於連僅執行一次的語句也要快取。過大的共享池也會對效能產生不良影響,因為搜尋需要的時間過長。

確定最優容量是一個效能調整問題,大多數資料庫都需要一個數百MB的共享池。有些應用程式需要1GB以上的共享池,但很少有應用程式能夠在共享池小於100MB時充分執行。共享池內有下列三種資料結構:


  • 庫緩衝:儲存最近執行的程式碼

  • 資料字典快取:儲存最近使用的物件定義

  • PL/SQL緩衝區:儲存的PL/SQL物件是過程、函式、打包的過程、打包的函式、物件型別定義和觸發器。


手動的調整共享池的大小:

select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE from v$sga_dynamic_components;   //顯示可以動態重設大小的SGA元件的當前最大和最小容量
ALTER SYSTEM SET SHARED_POOL_SIZE = 110M;


其他結構

大型池——主要用途是供共享的伺服器程式使用。
JAVA池——只有當應用程式需要在資料庫中執行java儲存程式時,才需要java池。

程式結構

程式結構主要有後臺程式和使用者連線程式兩大類。


使用者連線程式


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


使用者連線程式是連線使用者和Oracle Instance的橋樑。只有在User與Instance建立了連線以後,User才能夠對Oracle Server進行操作。

使用者連線程式 = 使用者程式 + 服務程式 + PGA


使用者程式User Process

當一個Database User請求連線到Oracle Server時,Oracle Server會建立User Process。


User Process的作用:


  • 為Database User與Server Process建立連線

  • 並不會直接與Oracle Server互動


connect連線:是User和Server Process之間的通訊通道。


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


Server Process服務程式

用於處理Database User和Oracle Server之間的連線。


當一個User與User Process建立了一個connect後,Oracle Server會建立一個Server Process。然後再由User Process與Server Process建立了連線之後,Server Process會透過使用者提交的請求資訊來確定與oracle instance建立一個會話。


Server Process的作用:


  • 與Oracle Server直接互動

  • 複製執行和返回結果


Session會話:一個使用者透過User Process(本質是透過Server Process)與Oracle Instance建立連線後稱之為一個會話,一個使用者可以建立多個會話,即同時使用同一個使用者可以多次的連線到同一個例項,也就是說多個session可以使用同一個connect。


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


程式全域性區PGA


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


PGA:Oracle Server Process分配來專門用於當前User Session的記憶體區。該區域是私有的,不同的使用者擁有不同的PGA。

PGA包含了Server Process資料和控制資訊的記憶體區域。,由下列3個部分組成:


1. 棧空間:儲存Session的變數、陣列等的記憶體空間。
2. Session Info:如果執行的不是多執行緒伺服器,會話資訊將儲存在PGA中,如果是多執行緒伺服器,則儲存在SGA中。
3. 私有SQL區:用來儲存繫結變數(binding variables)和執行時緩衝區(runtime buffers)等資訊。

Oracle的connect連線和session會話與User Process緊密相關

注意:在RDBMS中由db\_name和instance\_name共同確定一個Database,所以Instance_name被用於Oracle與OS之間的聯絡同時也被用於Oracle Server與外部連線時使用。

所以在User提交連線請求的時候,User Process首先會與Server Process建立Connect,然後Server Process會透過請求中所包含的db\_name和Instance\_name來確定需要且可以被連線的資料庫(RDBMS可以存在多個資料庫),這樣就確保了RDBMS在擁有多個資料庫的情況下,還能夠保證每一個Database的獨立性。而且同一個Database可以被多個屬於這個Databse的不同使用者發起的Instance連線。這一個功能是非常有必要的,因為每一個不同的資料庫中都包含有同名的sys、system等系統使用者。


後臺程式

後臺程式主要是完成資料庫管理任務 ,後臺程式是Oracle Instance和Oracle Database的聯絡紐帶,分為核心程式和非核心程式。


1. 核心程式:核心程式,必須存在,有一個終止,所有資料庫程式全部終止,例項崩潰!其中五大程式全都是核心程式。
2. 非核心程式:完成資料庫的額外功能,非核心程式死亡資料庫不會崩潰!

常用的核心程式:


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


在使用者訪問資料庫時,首先會提交請求,再分配SGA記憶體,建立並啟動後臺程式和例項,最後建立連線和會話。Oracle Server執行過程中必須啟動上面的前五個程式。否則例項無法建立。

檢視後臺程式:

SQL> select name,description from v$bgprocess where paddr<>'00';


NAME  DESCRIPTION

----- ----------------------------------------------------------------

PMON  process cleanup

PSP0  process spawner 0

MMAN  Memory Manager

DBW0  db writer process 0

LGWR  Redo etc.

CKPT  checkpoint

SMON  System Monitor Process

RECO  distributed recovery

CJQ0  Job Queue Coordinator

QMNC  AQ Coordinator

MMON  Manageability Monitor Process
NAME  DESCRIPTION

----- ----------------------------------------------------------------

MMNL  Manageability Monitor Process 2


資料庫寫入程式(DBWn)


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


Server process連線Oracle後,透過資料庫寫程式(DBWn)將資料緩衝區中的“髒緩衝區”的資料塊寫入到儲存結構(資料檔案、磁碟檔案)

Database writer (DBWn)資料庫寫程式:


  • 只做一件事,將資料寫到磁碟。就是將資料庫的變化寫入到資料檔案。

  • 該程式最多20 個,即使你有36 個CPU 也只能最多有20 個資料庫寫程式。
    程式名稱DBW0-DBW9 DBWa-DBWj

  • 注意:資料庫寫程式越多,寫資料的效率越高。該程式的個數應該和cpu的個數對應,如果設定的資料庫寫程式數大於CPU 的個數也不會有太明顯的效果,因為CPU 是分時的。


檢查點(CKPT)


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


Checkpoint (CKPT)檢查點程式:


  • 主要使用者更新資料檔案頭,更新控制檔案和觸發DBWn資料庫寫程式。

  • Ckpt 程式會降低資料庫效能,但是提高資料庫崩潰時,自我恢復的效能。我們可以理解為階段性的儲存資料,一定的條件滿足就觸發,執行DBWn存檔操作。


程式監視程式(PMON)


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


Process monitor(PMON)程式監測程式:


PMON在後臺程式執行失敗後負責清理資料庫快取和閒置資源,是Oracle的自動維護機制。


  • 清除死程式

  • 重新啟動部分程式(如排程程式)

  • 監聽的自動註冊

  • 回滾事務

  • 釋放鎖

  • 釋放其他資


系統監視程式(SMON)


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


System monitor (SMON)系統監測程式:


  • SMON啟動後會自動的用於在例項崩潰時進行資料庫例項自動恢復。

  • 清除作廢的排序臨時段,回收整理碎片,合併空閒空間,釋放臨時段,維護閃回的時間點。

  • 在老資料庫版本中,當我們大量刪除表的時候,會觀測到SMON程式很忙,直到把所有的碎片空間都整理完畢。


重做日誌檔案和日誌寫入程式


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


主要用於記錄資料庫的改變和記錄資料庫被改變之前的原始狀態,所以應當對其作多重備份,用於恢復和排錯。

啟用LGWR的情況:


  • 提交指令

  • 日誌緩衝區超過1/3

  • 每三秒

  • 每次DBWn執行之前


歸檔程式(ARCn)——是非核心程式。


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


儲存結構

Oracle RDBMS儲存結構主要由Database組成。


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


又能夠將Database分為物理結構和邏輯結構來理解。


物理結構

Database物理結構:是Database在作業系統中的檔案集合,即:磁碟上的物理檔案,主要由資料檔案、控制檔案、重做日誌檔案、歸檔日誌檔案、引數檔案、口令檔案組成。


Data Files

資料檔案是資料的儲存倉庫:


• 包括所有的資料庫資料
• 只能屬於一個資料庫
• 來自於被稱為”表空間”的資料庫儲存邏輯單元
• 可以直接被讀進記憶體,在執行SQL語句的時候,會將相關的資料檔案副本載入如資料緩衝區。
• 透過備份策略可以使資料檔案得到保護

Redo Log Files

重做日誌檔案包含對資料庫所做的更改操作記錄,在Oracle發生故障時能夠恢復資料。
能夠恢復資料的原理:重做日誌檔案會按時間的順序,將應用於資料庫的一連串的變更向量(做了什麼操作)儲存起來(即將變更的地方標記起來)。其中包含了所有已經完成操作的資訊和完成操作之前的資料庫狀態。如果資料檔案受損,就可以將這些變更向量應用於資料檔案備份來進行重做(重建)工作,將它恢復到發生故障的那一刻前的狀態。重做日誌檔案又分為下面兩種型別:


  • 聯機重做日誌檔案:記錄連續的資料庫操作

  • 歸檔日誌檔案Archived Log Files:用於時間點恢復,當RedoLogFiles存滿時,會對這些日誌進行歸檔備份,以便以後還原資料時使用。

    • 檢視redo log info:


SQL> select member from v$logfile;    # v$logfile資料字典,記錄了redolog檔案的列表 
MEMBER--------------------------------------------------------------------------------
 /u01/oradata/demo/redo03.log 
 /u01/oradata/demo/redo02.log 
 /u01/oradata/demo/redo01.log


Control Files


控制檔案包含維護和驗證資料庫完整性的必要的資訊。

它記錄了聯機重做日誌檔案、資料檔案的位置、更新的歸檔日誌檔案的位置。它還儲存著維護資料庫完整性所需的資訊,如資料庫名。控制檔案是以二進位制型式儲存的,使用者無法修改控制檔案的內容。控制檔案不過數MB,卻起著至關重要的作用。


Parameter File

例項引數檔案,當啟動oracle例項時,SGA結構會根據此引數檔案的設定記憶體,後臺程式會據此啟動。


Password File

使用者透過提交username/password來建立會話,Oracle根據儲存在資料字典的使用者定義對使用者名稱和口令進行驗證。


邏輯結構

表空間就是典型的Oracle邏輯結構型別 —— 裡面存放著若干的資料檔案。


表空間:用於儲存資料庫物件的邏輯空間,表空間是在資料庫中開闢的一個空間,用於存放資料庫的物件,它是資訊儲存的最大邏輯單位,是存放資料庫檔案的地方,其中資料又被存放在表空間中的資料檔案中。一個資料庫可以由多個表空間組成,Oracle的調優就是透過表空間來實現的。(Oracle資料庫獨特的高階應用)

表空間的作用:分類管理、批次處理; 將瑣碎的磁碟檔案整合、抽象處理成為邏輯結構。這樣更加便於我們去管理資料庫。


邏輯空間到物理空間的對映

段、區和塊:


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


執行一條寫入的SQL語句時在RDBMS中都發生了什麼


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構


1. 將SQL語句載入入資料庫緩衝區
2. 將SQL語句要操作的資料檔案副本載入入資料庫緩衝區
3. 執行SQL語句,修改資料檔案副本,形成“髒緩衝區”
4. CKPT檢測到“髒緩衝區”,呼叫DBWn
5. 在DBWn執行之前,先執行了LGWR,將資料檔案的原始狀態和資料庫的改變記錄到Redo Log Files
6. 執行DBWn,將“髒緩衝區的內容寫入到資料檔案”
7. 同時CKPT修改控制檔案和資料檔案頭
8. SMON回收不必要的空閒資源

最後

最後我們舉個例子來看看Oracle RDBMS是怎麼運作的


萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構

萬字詳解Oracle架構、原理、程式,學會世間再無複雜架構

  • User訪問Oracle Server之前提交一個請求(包含了db_name、instance_name、username、password等資訊),Oracle Server接收到請求並透過Password File的驗證後,分配SGA記憶體池,啟動後臺程式同時建立並啟動例項。

  • 在啟動例項之後User Process與Server Process建立Connect。

  • 再透過Server process和Oracle Instance完成建立Sesscion。

  • 使用者執行SQL語句,由server process接收到並直接與Oracle互動。

  • SQL語句透過Server Process到達Oracle Instance,再將SQL載入資料庫緩衝區。

  • Server Process通知Oracle Database將與SQL語句相關的資料塊副本載入到緩衝區中。

  • 在資料庫快取區執行SQL語句,併產生”髒緩衝區”。

  • 由CKPT檢查點程式檢查到”髒緩衝區”,並呼叫DBWn資料庫寫程式,但在DBWn執行之前,應該由LGWR先將資料檔案的原始狀態、資料庫的改變等資訊記錄到Redo Log Files。

  • 將更新的內容寫入到磁碟中的資料檔案。

  • 返回結果給使用者

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556440/viewspace-2642305/,如需轉載,請註明出處,否則將追究法律責任。

相關文章