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

lhrbest發表於2019-04-17

詳解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個程式。

 

SGA

SHARE POOL

(共享池)

用如下命令可以調整

ALTER SYSTEM SET

SHARED_POOL_SIZE=64M

LIBRARY CACHE

(庫快取記憶體)

1儲存最近使用的 SQLPL/SQL語句資訊

2包括 SHARED SQLSHARED PL/SQL

3LRU演算法管理

4大小由 SHARE POOL大小決定

DATA DICTIONARY CACHE

(資料字典快取記憶體)

1資料庫中最近使用的定義的集合

2包含資料庫檔案,表,索引,列,使用者,許可權和其他的資料庫物件相關資訊

3在語法分析階段,伺服器程式會在資料字典中查詢用於物件解析和驗證訪問的資訊

4將資料字典資訊快取記憶體到記憶體中,可縮短查詢和 DML的響應時間

5大小由共享池的大小決定

DATABASE BUFFER CACHE

(資料緩衝區快取記憶體)

1儲存已從資料檔案檢索到的資料的複本

2大幅提高讀取和更新資料的效能

3使用 LRU演算法管理

4主塊的大小由 DB_BLOCK_SIZE確定

REDO LOG BUFFER

(重做日誌緩衝區)

1記錄對資料庫資料塊作的全部更改

2主要用來恢復

3其中記錄的更改被稱作重做條目

4重做條目包含用於重新構建或重做更改的資訊

5大小由 LOG_BUFFER定義

LARGE POOL

(大型池)

1 SGA可選的記憶體區

2分擔了共享池的一部分工作

3用於共享伺服器的 UGA

4用於 I/O伺服器程式

5備份和恢復操作或 RMAN

6並行執行訊息緩衝區(前提 PARALLEL_POOL_SIZE=TRUE

7不使用 LRU列表

8大小由 LARGE_POOL_SIZE確定

JAVA POOL

JAVA池)

1儲存 JAVA命令服務分析要求

2安裝和使用 JAVA時必須的

3大小有 JAVA_POOL_SIZE確定

PGA

PRIVATE SQL AREA

(專用 SQL區)

 

專用 SQL 區的位置取決於為會話建立的連線型別。在專用伺服器環境中,專用 SQL 區位於各自伺服器程式的 PGA中。在共享伺服器環境中,專用 SQL 區位於 SGA 中。

管理專用 SQL 區是使用者程式的職責。使用者程式可以分配的專用 SQL 區的數目始終由

初始化引數 OPEN_CURSORS 來限制。該引數的預設值是 50

PERSISTEN AREA

(永久區)

包含繫結資訊,並且只在關閉遊標時釋放

RUNTIME AREA

(執行時區)

在執行請求時的第一步建立。對於 INSERTUPDATE DELETE命令,該區在執行語句後釋放,對於查詢操作,該區只在提取所有行或取消查詢後釋放。

SESSION MEMORY

(會話記憶體)

包含為保留會話變數以及與該會話相關的其它資訊而分配的記憶體。對於共享伺服器環境,該會話是共享的而不是專用的。

SQL WORK AREAS

SQL工作區)

用於大量佔用記憶體的操作,如排序、雜湊聯接、點陣圖合併和點陣圖建立。

工作區的大小可進行控制和調整


下表是後臺程式總結


DBWn

DBWn 延遲寫入資料檔案 ,直到發生下列事件之一:

 增量或正常檢查點

 灰資料緩衝區的數量達到閾值

 程式掃描指定數量的塊而無法找到任何空閒緩衝區時

 出現超時

 實時應用叢集 (Real Application Clusters, RAC) 環境中出現 ping 請求

 使一般表空間或臨時表空間處於離線狀態

 使表空間處於只讀模式

 刪除或截斷表

 執行 ALTER TABLESPACE 表空間名 BEGIN BACKUP 操作

LGWR

LGWR 在下列情況下執行從重做日誌緩衝區到重做日誌檔案的連續寫入:

 當提交事務時

 當重做日誌緩衝區的三分之一填滿時

 當重做日誌緩衝區中記錄了超過 1 MB 的更改時

 DBWn 將資料庫緩衝區快取記憶體中修改的塊寫入資料檔案以前

 每隔三秒

SMON

例程恢復

 前滾重做日誌中的更改

 開啟資料庫供使用者訪問

 回退未提交的事務處理

 合併空閒空間

 回收臨時段

PMON

程式失敗後,後臺程式 PMON 透過下面的方法進行清理:

 回退使用者的當前事務處理

 釋放當前保留的所有表鎖或行鎖

 釋放使用者當前保留的其它資源

 重新啟動已失效的排程程式

CKPT

 在檢查點發訊號給 DBWn

 使用檢查點資訊更新資料檔案的標頭

 使用檢查點資訊更新控制

啟動檢查點的原因如下:

 確保定期向磁碟寫入記憶體中發生修改的資料塊,以便在系統或資料庫失敗時不會丟失資料

 縮短例程恢復所需的時間。只需處理最後一個檢查點後面的重做日誌條目以啟動恢復操作

 確保提交的所有資料在關閉期間均已寫入資料檔案

CKPT 寫入的檢查點資訊包括檢查點位置、系統更改號、重做日誌中恢復操作的起始位置以及有關日誌的資訊等等。

注: CKPT 並不將資料塊寫入磁碟,或將重做塊寫入聯機重做日誌。

ARCn

 可選的後臺程式

 設定 ARCHIVELOG 模式時自動歸檔聯機重做日誌

 保留資料庫的全部更改記錄


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


Oracle的基礎架構知識


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



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





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 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之間的通訊通道。



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。



程式全域性區PGA



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. 非核心程式: 完成資料庫的額外功能,非核心程式死亡資料庫不會崩潰!

常用的核心程式:



在使用者訪問資料庫時,首先會提交請求,再分配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
MMNL  Manageability Monitor Process 2


資料庫寫入程式(DBWn)



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

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


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

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

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


檢查點(CKPT)



Checkpoint (CKPT)檢查點程式:


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

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


程式監視程式(PMON)



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


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


  • 清除死程式

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

  • 監聽的自動註冊

  • 回滾事務

  • 釋放鎖

  • 釋放其他資


系統監視程式(SMON)



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


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

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

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


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



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

啟用LGWR的情況:


  • 提交指令

  • 日誌緩衝區超過1/3

  • 每三秒

  • 每次DBWn執行之前


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



儲存結構

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



又能夠將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資料庫獨特的高階應用)

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


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

    段、區和塊:



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



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

    最後

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




    • 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。

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

    • 返回結果給使用者





    About Me

    ........................................................................................................................

    ● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

    ● 本文在itpub( http://blog.itpub.net/26736162)、部落格園( http://www.cnblogs.com/lhrbest)和個人weixin公眾號( xiaomaimiaolhr)上有同步更新

    ● 本文itpub地址: http://blog.itpub.net/26736162

    ● 本文部落格園地址: http://www.cnblogs.com/lhrbest

    ● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/

    ● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

    ● DBA寶典今日頭條號地址:

    ........................................................................................................................

    ● QQ群號: 230161599(滿) 、618766405

    ● weixin群:可加我weixin,我拉大家進群,非誠勿擾

    ● 聯絡我請加QQ好友 646634621 ,註明新增緣由

    ● 於 2019-04-01 06:00 ~ 2019-04-30 24:00 在魔都完成

    ● 最新修改時間:2019-04-01 06:00 ~ 2019-04-30 24:00

    ● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

    ● 版權所有,歡迎分享本文,轉載請保留出處

    ........................................................................................................................

    小麥苗的微店

    小麥苗出版的資料庫類叢書http://blog.itpub.net/26736162/viewspace-2142121/

    小麥苗OCP、OCM、高可用網路班http://blog.itpub.net/26736162/viewspace-2148098/

    小麥苗騰訊課堂主頁https://lhr.ke.qq.com/

    ........................................................................................................................

    使用 weixin客戶端掃描下面的二維碼來關注小麥苗的weixin公眾號( xiaomaimiaolhr)及QQ群(DBA寶典)、新增小麥苗weixin, 學習最實用的資料庫技術。

    ........................................................................................................................

    歡迎與我聯絡

     

     



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

    相關文章