目錄
系統(tǒng)全局區(qū)SGA
高速緩存緩沖區(qū)(數(shù)據(jù)庫(kù)緩沖區(qū))
日志緩沖區(qū)
共享池
其他結(jié)構(gòu)
用戶連接進(jìn)程
用戶進(jìn)程User Process
Server Process服務(wù)進(jìn)程
程序全局區(qū)PGA
Oracle的connect連接和session會(huì)話與User Process緊密相關(guān)
后臺(tái)進(jìn)程
數(shù)據(jù)庫(kù)寫入進(jìn)程(DBWn)
檢查點(diǎn)(CKPT)
進(jìn)程監(jiān)視進(jìn)程(PMON)
系統(tǒng)監(jiān)視進(jìn)程(SMON)
重做日志文件和日志寫入進(jìn)程
歸檔進(jìn)程(ARCn)
物理結(jié)構(gòu)
Data Files
Redo Log Files
Control Files
Parameter File
Password File
邏輯結(jié)構(gòu)
邏輯空間到物理空間的映射
Oracle架構(gòu),講述了Oracle RDBMS的底層實(shí)現(xiàn)原理,是Oracle DBA**調(diào)優(yōu)和排錯(cuò)的基礎(chǔ)理論。深入理解Oracle架構(gòu),能夠讓我們?cè)贠racle的路上走的更遠(yuǎn)。本文主要是在對(duì)RDBMS的底層組件功能和實(shí)現(xiàn)原理有一定的了解的情況下,結(jié)合自身的工作經(jīng)驗(yàn)提出了對(duì)Oracle調(diào)優(yōu)和排錯(cuò)的思路。**當(dāng)然,對(duì)Oracle體系結(jié)構(gòu)的理解是一個(gè)深遠(yuǎn)的過(guò)程,需要不斷的更新修改,如有不對(duì),還望指正。:)
Oracle RDBMS架構(gòu)圖
一般我們所說(shuō)的Oracle指的是Oracle RDBMS(Relational databases Management system),一套Oracle數(shù)據(jù)庫(kù)管理系統(tǒng),也稱之為Oracle Server。而Oracle Server主要有兩大部分:
Oracle Server = 實(shí)例 + 數(shù)據(jù)庫(kù)?(Instance和Database是相互獨(dú)立的)
- 數(shù)據(jù)庫(kù) = 數(shù)據(jù)文件 + 控制文件 +日志文件
- 實(shí)例 = 內(nèi)存池 + 后臺(tái)進(jìn)程
所以可以細(xì)分為:?Oracle Server = 內(nèi)存池 + 后臺(tái)進(jìn)程 + 數(shù)據(jù)文件 + 控制文件 + 日志文件
一臺(tái)Oracle Server支持創(chuàng)建多個(gè)Database,而且每個(gè)Datacase是互相隔離而獨(dú)立的。不同的Database擁有屬于自己的全套相關(guān)文件,例如:有各自的密碼文件,參數(shù)文件,數(shù)據(jù)文件,控制文件和日志文件。
Database由一些物理文件(如:存放在存儲(chǔ)設(shè)備中的二維表文件)組成。二維表存儲(chǔ)在Database中,但Database的內(nèi)容不能被用戶直接讀取,用戶必須通過(guò)Oracle instance才能夠訪問(wèn)Database,一個(gè)Instance只能連接一個(gè)Database,但是一個(gè)Database可以被多個(gè)Instance連接。
將上面的Oracle RDBMS架構(gòu)圖進(jìn)行抽象分類,可以將Oracle架構(gòu)抽象為:Oracle體系 = 內(nèi)存結(jié)構(gòu) + 進(jìn)程結(jié)構(gòu) + 存儲(chǔ)結(jié)構(gòu)
內(nèi)存結(jié)構(gòu)
Oracle Instance是Oracle RDBMS的核心之一,負(fù)責(zé)RDBMS的管理功能。Oracle Instance主要由內(nèi)存池SGA和后臺(tái)進(jìn)程組成。
系統(tǒng)全局區(qū)SGA
內(nèi)存池SGA的默認(rèn)Size,會(huì)在安裝Oracle的時(shí)候會(huì)根據(jù)LinuxOS的sysctl.conf
參數(shù)文件來(lái)決定:
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 #對(duì)應(yīng)kernel.shmmax = 2147483648
Fixed Size 2022144 bytes
Variable Size 503317760 bytes
Database Buffers 1627389952 bytes
Redo Buffers 14753792 bytes
SGA(System Global Area)是與Oracle性能關(guān)系最大的核心部分,也是對(duì)Oracle進(jìn)行調(diào)優(yōu)的主要考量。SGA內(nèi)存池會(huì)在Instance啟動(dòng)時(shí)被分配,在Instance關(guān)閉時(shí)被釋放。在一定范圍內(nèi),SGA可以在Instance運(yùn)行時(shí)通過(guò)自動(dòng)方式響應(yīng)DBA的指令。如果想對(duì)SGA進(jìn)行調(diào)優(yōu)還必須理解SGA所包含如下幾種數(shù)據(jù)結(jié)構(gòu):
高速緩存緩沖區(qū)(數(shù)據(jù)庫(kù)緩沖區(qū))
數(shù)據(jù)庫(kù)緩沖區(qū)是oracle執(zhí)行SQL語(yǔ)句的區(qū)域。
例如在更新數(shù)據(jù)時(shí),用戶執(zhí)行的SQL語(yǔ)句不會(huì)直接對(duì)磁盤上的數(shù)據(jù)文件進(jìn)行更改操作,而是首先將數(shù)據(jù)文件復(fù)制到數(shù)據(jù)庫(kù)緩沖區(qū)緩存(就是說(shuō)數(shù)據(jù)庫(kù)緩沖區(qū)里會(huì)存放著SQL相關(guān)數(shù)據(jù)文件副本),再更改應(yīng)用于數(shù)據(jù)庫(kù)緩沖區(qū)緩存中這些數(shù)據(jù)塊的副本。而且數(shù)據(jù)塊副本將在緩存中保留一段時(shí)間,直至其占用的緩沖區(qū)被另一個(gè)數(shù)據(jù)庫(kù)覆蓋為止(緩沖區(qū)Size有限)。
在查詢數(shù)據(jù)時(shí),為了提高執(zhí)行效率,查詢的數(shù)據(jù)也要經(jīng)過(guò)緩存。建立的Session會(huì)計(jì)算出那些數(shù)據(jù)塊包含關(guān)鍵的行,并將它們復(fù)制到數(shù)據(jù)庫(kù)緩沖區(qū)中進(jìn)行緩存。此后,相關(guān)關(guān)鍵行會(huì)傳輸?shù)絊ession的PGA作進(jìn)一步處理。這些數(shù)據(jù)塊也會(huì)在數(shù)據(jù)庫(kù)緩存區(qū)緩存中保留一段時(shí)間。
一般情況下,被頻繁訪問(wèn)的數(shù)據(jù)塊會(huì)存在于數(shù)據(jù)庫(kù)緩沖區(qū)緩存中,從而最大程度地減少對(duì)磁盤I/O的需要。
那什么時(shí)候會(huì)將被更新的數(shù)據(jù)塊副本寫入到磁盤中的數(shù)據(jù)文件呢?
答案就是:如果在緩沖區(qū)緩存中存儲(chǔ)的數(shù)據(jù)塊與磁盤上的數(shù)據(jù)塊不同時(shí),那么這樣的緩沖區(qū)常稱為”臟緩沖區(qū)”,臟緩沖區(qū)中的數(shù)據(jù)塊副本就必須寫回到磁盤的數(shù)據(jù)文件中。
調(diào)優(yōu):數(shù)據(jù)庫(kù)緩沖區(qū)緩存的大小會(huì)對(duì)性能產(chǎn)生至關(guān)重要的影響,具體需要多大的Size才能成為最佳配比還要結(jié)合實(shí)際的生產(chǎn)環(huán)境而言。總體而言可以依據(jù)以下兩點(diǎn)基本要求來(lái)判斷:
1. 緩存應(yīng)足夠大,以便能緩存所有被頻繁訪問(wèn)的數(shù)據(jù)塊。如果緩存過(guò)小,那么將導(dǎo)致磁盤I/0活動(dòng)過(guò)多,因?yàn)轭l繁訪問(wèn)的數(shù)據(jù)塊持續(xù)從磁盤讀取,并由其他數(shù)據(jù)塊使用和重寫,然后再?gòu)拇疟P讀取。
2. 但也不能太大,以至于它會(huì)將極少被訪問(wèn)的塊也一并加入到緩存中,這樣會(huì)增長(zhǎng)在緩存中搜索的時(shí)間。
數(shù)據(jù)庫(kù)緩沖區(qū)緩存在Instance啟動(dòng)時(shí)被分配。從數(shù)據(jù)庫(kù)9i開(kāi)始,可以隨時(shí)將其調(diào)大或調(diào)小??梢圆捎檬謩?dòng)方式重調(diào),也可以根據(jù)工作負(fù)荷自動(dòng)重調(diào)大小(事務(wù))。
修改緩沖區(qū)DB_CACHE_SIZE地方法:
#Step1. 查看SGA的大?。阂?yàn)镈B_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. 計(jì)算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
日志緩沖區(qū)
日志緩沖區(qū)是小型的、用于短期存儲(chǔ)將寫入到磁盤上的重做日志的變更向量的臨時(shí)區(qū)域。主要作用是提供更加快的日志處理效率。
共享池
共享池的大小也對(duì)性能產(chǎn)生重要影響
1. 它應(yīng)該足夠大,以便緩存所有頻繁執(zhí)行的代碼和頻繁訪問(wèn)的對(duì)象定義。如果共享池過(guò)小,則性能下降,因?yàn)榉?wù)器會(huì)話將反復(fù)搶奪其中的空間來(lái)分析語(yǔ)句,此后,這些語(yǔ)句會(huì)被其他語(yǔ)句重寫,在重新執(zhí)行時(shí),將不得不再次分析。如果共享池小于最優(yōu)容量,則性能將下降。但有一個(gè)最小容量,如果低于此限度,則語(yǔ)句將失敗。
2. 但也不能過(guò)大,以至于連僅執(zhí)行一次的語(yǔ)句也要緩存。過(guò)大的共享池也會(huì)對(duì)性能產(chǎn)生不良影響,因?yàn)樗阉餍枰臅r(shí)間過(guò)長(zhǎng)。
確定最優(yōu)容量是一個(gè)性能調(diào)整問(wèn)題,大多數(shù)數(shù)據(jù)庫(kù)都需要一個(gè)數(shù)百M(fèi)B的共享池。有些應(yīng)用程序需要1GB以上的共享池,但很少有應(yīng)用程序能夠在共享池小于100MB時(shí)充分運(yùn)行。共享池內(nèi)有下列三種數(shù)據(jù)結(jié)構(gòu):
- 庫(kù)緩沖:存儲(chǔ)最近執(zhí)行的代碼
- 數(shù)據(jù)字典緩存:存儲(chǔ)最近使用的對(duì)象定義
- PL/SQL緩沖區(qū):存儲(chǔ)的PL/SQL對(duì)象是過(guò)程、函數(shù)、打包的過(guò)程、打包的函數(shù)、對(duì)象類型定義和觸發(fā)器。
手動(dòng)的調(diào)整共享池的大小:
select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE from v$sga_dynamic_components; //顯示可以動(dòng)態(tài)重設(shè)大小的SGA組件的當(dāng)前最大和最小容量
ALTER SYSTEM SET SHARED_POOL_SIZE = 110M;
其他結(jié)構(gòu)
這里暫時(shí)不做詳細(xì)介紹。
大型池
主要用途是供共享的服務(wù)器進(jìn)程使用。
JAVA池
只有當(dāng)應(yīng)用程序需要在數(shù)據(jù)庫(kù)中運(yùn)行java存儲(chǔ)程序時(shí),才需要java池。
進(jìn)程結(jié)構(gòu)
進(jìn)程結(jié)構(gòu)主要有后臺(tái)進(jìn)程和用戶連接進(jìn)程兩大類。
用戶連接進(jìn)程
用戶連接進(jìn)程是連接用戶和Oracle Instance的橋梁。只有在User與Instance建立了連接以后,User才能夠?qū)racle Server進(jìn)行操作。
用戶連接進(jìn)程?=?用戶進(jìn)程?+?服務(wù)進(jìn)程?+?PGA
用戶進(jìn)程User Process
當(dāng)一個(gè)Database User請(qǐng)求連接到Oracle Server時(shí),Oracle Server會(huì)創(chuàng)建User Process。
User Process的作用:
- 為Database User與Server Process建立連接
- 并不會(huì)直接與Oracle Server交互
connect連接:是User和Server Process之間的通信通道。
Server Process服務(wù)進(jìn)程
用于處理Database User和Oracle Server之間的連接。
當(dāng)一個(gè)User與User Process建立了一個(gè)connect后,Oracle Server會(huì)創(chuàng)建一個(gè)Server Process。然后再由User Process與Server Process建立了連接之后,Server Process會(huì)通過(guò)用戶提交的請(qǐng)求信息來(lái)確定與oracle instance建立一個(gè)會(huì)話。
Server Process的作用:
- 與Oracle Server直接交互
- 復(fù)制執(zhí)行和返回結(jié)果
Session會(huì)話:一個(gè)用戶通過(guò)User Process(本質(zhì)是通過(guò)Server Process)與Oracle Instance建立連接后稱之為一個(gè)會(huì)話,一個(gè)用戶可以建立多個(gè)會(huì)話,即同時(shí)使用同一個(gè)用戶可以多次的連接到同一個(gè)實(shí)例,也就是說(shuō)多個(gè)session可以使用同一個(gè)connect。
程序全局區(qū)PGA
PGA:Oracle Server Process分配來(lái)專門用于當(dāng)前User Session的內(nèi)存區(qū)。該區(qū)域是私有的,不同的用戶擁有不同的PGA。
PGA包含了Server Process數(shù)據(jù)和控制信息的內(nèi)存區(qū)域。,由下列3個(gè)部分組成:
1. ??臻g:存儲(chǔ)Session的變量、數(shù)組等的內(nèi)存空間。
2. Session Info:如果運(yùn)行的不是多線程服務(wù)器,會(huì)話信息將保存在PGA中,如果是多線程服務(wù)器,則保存在SGA中。
3. 私有SQL區(qū):用來(lái)保存綁定變量(binding variables)和運(yùn)行時(shí)緩沖區(qū)(runtime buffers)等信息。
Oracle的connect連接和session會(huì)話與User Process緊密相關(guān)
注意:在RDBMS中由db\_name
和instance\_name
共同確定一個(gè)Database,所以Instance_name被用于Oracle與OS之間的聯(lián)系同時(shí)也被用于Oracle Server與外部連接時(shí)使用。
所以在User提交連接請(qǐng)求的時(shí)候,User Process首先會(huì)與Server Process建立Connect,然后Server Process會(huì)通過(guò)請(qǐng)求中所包含的db\_name
和Instance\_name
來(lái)確定需要且可以被連接的數(shù)據(jù)庫(kù)(RDBMS可以存在多個(gè)數(shù)據(jù)庫(kù)),這樣就確保了RDBMS在擁有多個(gè)數(shù)據(jù)庫(kù)的情況下,還能夠保證每一個(gè)Database的獨(dú)立性。而且同一個(gè)Database可以被多個(gè)屬于這個(gè)Databse的不同用戶發(fā)起的Instance連接。這一個(gè)功能是非常有必要的,因?yàn)槊恳粋€(gè)不同的數(shù)據(jù)庫(kù)中都包含有同名的sys
、system
等系統(tǒng)用戶。
后臺(tái)進(jìn)程
后臺(tái)進(jìn)程主要是完成數(shù)據(jù)庫(kù)管理任務(wù) ,后臺(tái)進(jìn)程是Oracle Instance和Oracle Database的聯(lián)系紐帶,分為核心進(jìn)程和非核心進(jìn)程。
1. 核心進(jìn)程:核心進(jìn)程,必須存在,有一個(gè)終止,所有數(shù)據(jù)庫(kù)進(jìn)程全部終止,實(shí)例崩潰!其中五大進(jìn)程全都是核心進(jìn)程。
2. 非核心進(jìn)程:完成數(shù)據(jù)庫(kù)的額外功能,非核心進(jìn)程死亡數(shù)據(jù)庫(kù)不會(huì)崩潰!
常用的核心進(jìn)程:
在用戶訪問(wèn)數(shù)據(jù)庫(kù)時(shí),首先會(huì)提交請(qǐng)求,再分配SGA內(nèi)存,創(chuàng)建并啟動(dòng)后臺(tái)進(jìn)程和實(shí)例,最后建立連接和會(huì)話。Oracle Server運(yùn)行過(guò)程中必須啟動(dòng)上面的前五個(gè)進(jìn)程。否則實(shí)例無(wú)法創(chuàng)建。
查看后臺(tái)進(jìn)程:
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
數(shù)據(jù)庫(kù)寫入進(jìn)程(DBWn)
Server process連接Oracle后,通過(guò)數(shù)據(jù)庫(kù)寫進(jìn)程(DBWn)將數(shù)據(jù)緩沖區(qū)中的“臟緩沖區(qū)”的數(shù)據(jù)塊寫入到存儲(chǔ)結(jié)構(gòu)(數(shù)據(jù)文件、磁盤文件)
Database writer (DBWn)數(shù)據(jù)庫(kù)寫進(jìn)程:
只做一件事,將數(shù)據(jù)寫到磁盤。就是將數(shù)據(jù)庫(kù)的變化寫入到數(shù)據(jù)文件。
該進(jìn)程最多20 個(gè),即使你有36 個(gè)CPU 也只能最多有20 個(gè)數(shù)據(jù)庫(kù)寫進(jìn)程。
進(jìn)程名稱DBW0-DBW9 DBWa-DBWj
注意:數(shù)據(jù)庫(kù)寫進(jìn)程越多,寫數(shù)據(jù)的效率越高。該進(jìn)程的個(gè)數(shù)應(yīng)該和cpu的個(gè)數(shù)對(duì)應(yīng),如果設(shè)置的數(shù)據(jù)庫(kù)寫進(jìn)程數(shù)大于CPU 的個(gè)數(shù)也不會(huì)有太明顯的效果,因?yàn)镃PU 是分時(shí)的。
檢查點(diǎn)(CKPT)
Checkpoint (CKPT)檢查點(diǎn)進(jìn)程:
主要用戶更新數(shù)據(jù)文件頭,更新控制文件和觸發(fā)DBWn數(shù)據(jù)庫(kù)寫進(jìn)程。
Ckpt 進(jìn)程會(huì)降低數(shù)據(jù)庫(kù)性能,但是提高數(shù)據(jù)庫(kù)崩潰時(shí),自我恢復(fù)的性能。我們可以理解為階段性的保存數(shù)據(jù),一定的條件滿足就觸發(fā),執(zhí)行DBWn存盤操作。
進(jìn)程監(jiān)視進(jìn)程(PMON)
Process monitor (PMON)進(jìn)程監(jiān)測(cè)進(jìn)程:
PMON在后臺(tái)進(jìn)程執(zhí)行失敗后負(fù)責(zé)清理數(shù)據(jù)庫(kù)緩存和閑置資源,是Oracle的自動(dòng)維護(hù)機(jī)制。
- 清除死進(jìn)程
- 重新啟動(dòng)部分進(jìn)程(如調(diào)度進(jìn)程)
- 監(jiān)聽(tīng)的自動(dòng)注冊(cè)
- 回滾事務(wù)
- 釋放鎖
- 釋放其他資
系統(tǒng)監(jiān)視進(jìn)程(SMON)
System monitor (SMON)系統(tǒng)監(jiān)測(cè)進(jìn)程:
SMON啟動(dòng)后會(huì)自動(dòng)的用于在實(shí)例崩潰時(shí)進(jìn)行數(shù)據(jù)庫(kù)實(shí)例自動(dòng)恢復(fù)。
清除作廢的排序臨時(shí)段,回收整理碎片,合并空閑空間,釋放臨時(shí)段,維護(hù)閃回的時(shí)間點(diǎn)。
在老數(shù)據(jù)庫(kù)版本中,當(dāng)我們大量刪除表的時(shí)候,會(huì)觀測(cè)到SMON進(jìn)程很忙,直到把所有的碎片空間都整理完畢。
重做日志文件和日志寫入進(jìn)程
主要用于記錄數(shù)據(jù)庫(kù)的改變和記錄數(shù)據(jù)庫(kù)被改變之前的原始狀態(tài),所以應(yīng)當(dāng)對(duì)其作多重備份,用于恢復(fù)和排錯(cuò)。
激活LGWR的情況:
- 提交指令
- 日志緩沖區(qū)超過(guò)1/3
- 每三秒
- 每次DBWn執(zhí)行之前
歸檔進(jìn)程(ARCn)
歸檔進(jìn)程(ARCn)是非核心進(jìn)程。
存儲(chǔ)結(jié)構(gòu)
Oracle RDBMS存儲(chǔ)結(jié)構(gòu)主要由Database組成。
又能夠?qū)atabase分為物理結(jié)構(gòu)和邏輯結(jié)構(gòu)來(lái)理解。
物理結(jié)構(gòu)
Database物理結(jié)構(gòu):是Database在操作系統(tǒng)中的文件集合,即:磁盤上的物理文件,主要由數(shù)據(jù)文件、控制文件、重做日志文件、歸檔日志文件、參數(shù)文件、口令文件組成。
Data Files
數(shù)據(jù)文件是數(shù)據(jù)的存儲(chǔ)倉(cāng)庫(kù)。
? 包括所有的數(shù)據(jù)庫(kù)數(shù)據(jù)
? 只能屬于一個(gè)數(shù)據(jù)庫(kù)
? 來(lái)自于被稱為”表空間”的數(shù)據(jù)庫(kù)存儲(chǔ)邏輯單元
? 可以直接被讀進(jìn)內(nèi)存,在執(zhí)行SQL語(yǔ)句的時(shí)候,會(huì)將相關(guān)的數(shù)據(jù)文件副本加載如數(shù)據(jù)緩沖區(qū)。
? 通過(guò)備份策略可以使數(shù)據(jù)文件得到保護(hù)
Redo Log Files
重做日志文件包含對(duì)數(shù)據(jù)庫(kù)所做的更改操作記錄,在Oracle發(fā)生故障時(shí)能夠恢復(fù)數(shù)據(jù)。
能夠恢復(fù)數(shù)據(jù)的原理:重做日志文件會(huì)按時(shí)間的順序,將應(yīng)用于數(shù)據(jù)庫(kù)的一連串的變更向量(做了什么操作)存儲(chǔ)起來(lái)(即將變更的地方標(biāo)記起來(lái))。其中包含了所有已經(jīng)完成操作的信息和完成操作之前的數(shù)據(jù)庫(kù)狀態(tài)。如果數(shù)據(jù)文件受損,就可以將這些變更向量應(yīng)用于數(shù)據(jù)文件備份來(lái)進(jìn)行重做(重建)工作,將它恢復(fù)到發(fā)生故障的那一刻前的狀態(tài)。重做日志文件又分為下面兩種類型:
- 聯(lián)機(jī)重做日志文件:記錄連續(xù)的數(shù)據(jù)庫(kù)操作
- 歸檔日志文件Archived Log Files:用于時(shí)間點(diǎn)恢復(fù),當(dāng)RedoLogFiles存滿時(shí),會(huì)對(duì)這些日志進(jìn)行歸檔備份,以便以后還原數(shù)據(jù)時(shí)使用。
- 查看redo log info:
SQL> select member from v$logfile; # v$logfile數(shù)據(jù)字典,記錄了redolog文件的列表 MEMBER
--------------------------------------------------------------------------------
/u01/oradata/demo/redo03.log
/u01/oradata/demo/redo02.log
/u01/oradata/demo/redo01.log
Control Files
控制文件包含維護(hù)和驗(yàn)證數(shù)據(jù)庫(kù)完整性的必要的信息。
它記錄了聯(lián)機(jī)重做日志文件、數(shù)據(jù)文件的位置、更新的歸檔日志文件的位置。它還存儲(chǔ)著維護(hù)數(shù)據(jù)庫(kù)完整性所需的信息,如數(shù)據(jù)庫(kù)名??刂莆募且远M(jìn)制型式存儲(chǔ)的,用戶無(wú)法修改控制文件的內(nèi)容??刂莆募贿^(guò)數(shù)MB,卻起著至關(guān)重要的作用。
Parameter File
實(shí)例參數(shù)文件,當(dāng)啟動(dòng)oracle實(shí)例時(shí),SGA結(jié)構(gòu)會(huì)根據(jù)此參數(shù)文件的設(shè)置內(nèi)存,后臺(tái)進(jìn)程會(huì)據(jù)此啟動(dòng)。
Password File
用戶通過(guò)提交username/password來(lái)建立會(huì)話,Oracle根據(jù)存儲(chǔ)在數(shù)據(jù)字典的用戶定義對(duì)用戶名和口令進(jìn)行驗(yàn)證。
邏輯結(jié)構(gòu)
表空間就是典型的Oracle邏輯結(jié)構(gòu)類型 ——?里面存放著若干的數(shù)據(jù)文件
表空間:用于存儲(chǔ)數(shù)據(jù)庫(kù)對(duì)象的邏輯空間,表空間是在數(shù)據(jù)庫(kù)中開(kāi)辟的一個(gè)空間,用于存放數(shù)據(jù)庫(kù)的對(duì)象,它是信息存儲(chǔ)的最大邏輯單位,是存放數(shù)據(jù)庫(kù)文件的地方,其中數(shù)據(jù)又被存放在表空間中的數(shù)據(jù)文件中。一個(gè)數(shù)據(jù)庫(kù)可以由多個(gè)表空間組成,Oracle的調(diào)優(yōu)就是通過(guò)表空間來(lái)實(shí)現(xiàn)的。(Oracle數(shù)據(jù)庫(kù)獨(dú)特的高級(jí)應(yīng)用)
表空間的作用:分類管理、批量處理; 將瑣碎的磁盤文件整合、抽象處理成為邏輯結(jié)構(gòu)。這樣更加便于我們?nèi)ス芾頂?shù)據(jù)庫(kù)。
邏輯空間到物理空間的映射
段、區(qū)和塊:
執(zhí)行一條寫入的SQL語(yǔ)句時(shí)在RDBMS中都發(fā)生了什么
1. 將SQL語(yǔ)句加載入數(shù)據(jù)庫(kù)緩沖區(qū)
2. 將SQL語(yǔ)句要操作的數(shù)據(jù)文件副本加載入數(shù)據(jù)庫(kù)緩沖區(qū)
3. 執(zhí)行SQL語(yǔ)句,修改數(shù)據(jù)文件副本,形成“臟緩沖區(qū)”
4. CKPT檢測(cè)到“臟緩沖區(qū)”,調(diào)用DBWn
5. 在DBWn運(yùn)行之前,先運(yùn)行了LGWR,將數(shù)據(jù)文件的原始狀態(tài)和數(shù)據(jù)庫(kù)的改變記錄到Redo Log Files
6. 運(yùn)行DBWn,將“臟緩沖區(qū)的內(nèi)容寫入到數(shù)據(jù)文件”
7. 同時(shí)CKPT修改控制文件和數(shù)據(jù)文件頭
8. SMON回收不必要的空閑資源
最后
最后我們舉個(gè)例子來(lái)看看Oracle RDBMS是怎么運(yùn)作的文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-808705.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-808705.html
- User訪問(wèn)Oracle Server之前提交一個(gè)請(qǐng)求(包含了db_name、instance_name、username、password等信息),Oracle Server接收到請(qǐng)求并通過(guò)Password File的驗(yàn)證后,分配SGA內(nèi)存池,啟動(dòng)后臺(tái)進(jìn)程同時(shí)創(chuàng)建并啟動(dòng)實(shí)例。
- 在啟動(dòng)實(shí)例之后User Process與Server Process建立Connect。
- 再通過(guò)Server process和Oracle Instance完成建立Sesscion。
- 用戶執(zhí)行SQL語(yǔ)句,由server process接收到并直接與Oracle交互。
- SQL語(yǔ)句通過(guò)Server Process到達(dá)Oracle Instance,再將SQL載入數(shù)據(jù)庫(kù)緩沖區(qū)。
- Server Process通知Oracle Database將與SQL語(yǔ)句相關(guān)的數(shù)據(jù)塊副本加載到緩沖區(qū)中。
- 在數(shù)據(jù)庫(kù)緩存區(qū)執(zhí)行SQL語(yǔ)句,并產(chǎn)生”臟緩沖區(qū)”。
- 由CKPT檢查點(diǎn)進(jìn)程檢查到”臟緩沖區(qū)”,并調(diào)用DBWn數(shù)據(jù)庫(kù)寫進(jìn)程,但在DBWn執(zhí)行之前,應(yīng)該由LGWR先將數(shù)據(jù)文件的原始狀態(tài)、數(shù)據(jù)庫(kù)的改變等信息記錄到Redo Log Files。
- 將更新的內(nèi)容寫入到磁盤中的數(shù)據(jù)文件。
- 返回結(jié)果給用戶
到了這里,關(guān)于Oracle架構(gòu)_數(shù)據(jù)庫(kù)底層原理、機(jī)制 (授人以漁)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!