首先看張圖:
對於一個數據庫系統來說,假設這個系統沒有運行,我們所能看到的和這個數據庫相關的無非就是幾個基於操作系統的物理文件,這是從靜態的角度來看,如果從動態的角度來看呢,也就是說這個數據庫系統運行起來了,能夠對外提供服務了,那就意外着數據庫系統啟動了自己的一個實例,綜合以上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存儲最近使用的SQL和PL/SQL語句信息 2包括SHARED SQL和SHARED PL/SQL 3用LRU算法管理 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 (運行時區) 在執行請求時的第一步創建。對於INSERT、UPDATE 和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和后台進程組成。
系統全局區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:
Connected.
USER is "SYS"
NAME VALUE
Fixed Size 2022144
Variable Size 503317760
Database Buffers 1627389952
Redo Buffers 14753792
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的影響
NAME TYPE VALUE
sga_max_size big integer 2G
#Step2. 查看show parameter shared_pool_size的大小
shared_pool_size big integer 0
#Step3. 計算DB_CACHE_SIZE的大小:shared_pool_size + db_cache_size = SGA_MAX_SIZE * 70%
#Step4. 修改DB_CACHE_SIZE的大小
System altered.
Enter password: ********
Connected.
Database closed.
Database dismounted.
ORACLE instance shut down.
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.
日志緩沖區
日志緩沖區是小型的、用於短期存儲將寫入到磁盤上的重做日志的變更向量的臨時區域。主要作用是提供更加快的日志處理效率。
共享池
共享池的大小也對性能產生重要影響:
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運行過程中必須啟動上面的前五個進程。否則實例無法創建。
查看后台進程:
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)
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;
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。
-
將更新的內容寫入到磁盤中的數據文件。
-
返回結果給用戶