
Oracle實(shí)例=內(nèi)存+后臺(tái)進(jìn)程
Oracle數(shù)據(jù)庫=實(shí)例+物理存儲(chǔ)結(jié)構(gòu)
由上圖可知Oracle實(shí)例(一個(gè)Instance)由內(nèi)存結(jié)構(gòu)和程序結(jié)構(gòu)組成,內(nèi)存結(jié)構(gòu)主要是SGA,程序結(jié)構(gòu)主要是后臺(tái)進(jìn)程。
物理存儲(chǔ)結(jié)構(gòu)主要是數(shù)據(jù)庫文件。
這次仔細(xì)學(xué)習(xí)了Oracle實(shí)例的具體內(nèi)容。
為什么Oracle數(shù)據(jù)庫做的這么復(fù)雜?
內(nèi)存
- 數(shù)據(jù)查詢的速度
- 更好的提升數(shù)據(jù)處理的速度
后臺(tái)進(jìn)程
- 為了完成特定的任務(wù)的服務(wù)進(jìn)程
數(shù)據(jù)文件
- 數(shù)據(jù)的永久性保存
- 也是數(shù)據(jù)庫性能下降的主要原因
實(shí)例之內(nèi)存結(jié)構(gòu)
System global area(SGA)
SGA區(qū)包括Oracle實(shí)例需要的一系列內(nèi)存組件,用于存放數(shù)據(jù)信息和數(shù)據(jù)控制信息,這些內(nèi)存信息被所有進(jìn)程所共享。SGA的各個(gè)組成包括:
| 組成 | 描述 |
|---|---|
| Database buffer cache | 數(shù)據(jù)庫高速緩沖區(qū),里面存放著從磁盤讀取到內(nèi)存的數(shù)據(jù)塊,這些數(shù)據(jù)塊可以被所有的會(huì)話訪問,是全局共享的。buffer cache分為三個(gè)部分,分別是default pool,keep pool,recycle pool。default pool是正常情況下,數(shù)據(jù)塊存放的內(nèi)存區(qū)域,default pool會(huì)根據(jù)一個(gè)過期算法(LRU,Least Recently Used,近期最少使用)將過期的臟數(shù)據(jù)(修改過的數(shù)據(jù),沒有修改的數(shù)據(jù)可以不寫到磁盤上)寫到磁盤上。keep pool這個(gè)區(qū)域用于將一些數(shù)據(jù)始終固定在內(nèi)存中。recycle pool存放一些不經(jīng)常使用的數(shù)據(jù)塊,避免這些數(shù)據(jù)塊在default pool中占據(jù)空間。 |
| Shared pool | 共享池緩存著一些用戶可以共用的信息:1、可以重新使用的SQL語句 2、存放一些數(shù)據(jù)字典的信息,包括用戶賬戶數(shù)據(jù),表,索引,權(quán)限等等。 3、存儲(chǔ)存放在數(shù)據(jù)庫中的可執(zhí)行代碼。 |
| Redo log buffer | 重做日志緩沖區(qū),存放著數(shù)據(jù)庫操作產(chǎn)生的redo數(shù)據(jù),Redo log buffer以循環(huán)的方式寫入,當(dāng)redo log已經(jīng)寫到磁盤后,就可以被后續(xù)的日志數(shù)據(jù)覆蓋。 |
| Large pool | 對(duì)數(shù)據(jù)的處理不適用LRU算法,比shared pool更搞笑的內(nèi)存收取方式。并行執(zhí)行時(shí)會(huì)使用large pool。Rman備份時(shí)啟動(dòng)并行備份方式時(shí),使用large pool。 |
| Java pool | 這塊內(nèi)存區(qū)域用來存放所有特定會(huì)話的JVM(Java Virtual Machine)中的java代碼和數(shù)據(jù)。 |
| Streams pool | 里面存放著流相關(guān)的信息,比如流隊(duì)列,其中也會(huì)流復(fù)制中capture進(jìn)程提供進(jìn)程內(nèi)存空間。Streams pool只為流復(fù)制提供內(nèi)存空間,如果沒有手工配置,也沒有配置流復(fù)制,這個(gè)空間將設(shè)置為0。 |
| Result cache | 結(jié)果緩存,當(dāng)表的訪問方式以讀為主前提下,從一張大表中過濾出少量的記錄作為結(jié)果集,把查詢結(jié)果集放入result cache,后續(xù)相同的查詢語句可以直接從result cache里獲取想要的結(jié)果,省去了CPU、I/O上的開銷。這個(gè)SGA組件加速了頻繁運(yùn)行的查詢語句的執(zhí)行速度。 |
Program global area(PGA)
不同于SGA,PGA屬于獨(dú)占式內(nèi)存區(qū),它的數(shù)據(jù)和控制信息為某個(gè)會(huì)話所獨(dú)有,當(dāng)一個(gè)會(huì)話產(chǎn)生時(shí),Oracle會(huì)為這個(gè)會(huì)話分配一個(gè)PGA內(nèi)存區(qū)域??梢岳斫鉃椴僮飨到y(tǒng)在一個(gè)進(jìn)程啟動(dòng)時(shí),為他分配的內(nèi)存空間,是一個(gè)操作系統(tǒng)含義上的內(nèi)存區(qū)。
User global Area(UGA)
UGA中保存和當(dāng)前會(huì)話相關(guān)的信息,比如會(huì)話登錄的信息,pl/sql的變量,綁定變量的值等等。UGA隨著連接方式不一樣可以在SGA中也可以在PGA中。
Software code areas
Oracle存放自身軟件代碼的一部分內(nèi)存區(qū),不允許其他會(huì)話訪問
后臺(tái)進(jìn)程
Oracle的進(jìn)程
用戶進(jìn)程 user process
服務(wù)器進(jìn)程 server process
實(shí)例后臺(tái)進(jìn)程 background process
windows查看Oracle有哪些后臺(tái)進(jìn)程
SQL> select program from v$session where program like 'ORACLE.EXE%';
PROGRAM
----------------------------------------------------------------
ORACLE.EXE (GEN0)
ORACLE.EXE (DIA0)
ORACLE.EXE (CKPT)
ORACLE.EXE (MMNL)
ORACLE.EXE (RVWR)
ORACLE.EXE (ARC0)
ORACLE.EXE (QMNC)
ORACLE.EXE (ARC1)
ORACLE.EXE (DIAG)
ORACLE.EXE (MMAN)
ORACLE.EXE (SMON)
PROGRAM
----------------------------------------------------------------
ORACLE.EXE (Q001)
ORACLE.EXE (SMCO)
ORACLE.EXE (PMON)
ORACLE.EXE (DBRM)
ORACLE.EXE (DBW0)
ORACLE.EXE (RECO)
ORACLE.EXE (ARC2)
ORACLE.EXE (Q002)
ORACLE.EXE (CJQ0)
ORACLE.EXE (W000)
ORACLE.EXE (VKTM)
PROGRAM
----------------------------------------------------------------
ORACLE.EXE (PSP0)
ORACLE.EXE (LGWR)
ORACLE.EXE (MMON)
ORACLE.EXE (ARC3)
已選擇26行。
下面重點(diǎn)看一些Oracle后臺(tái)進(jìn)程(鏈接內(nèi)存和磁盤的橋梁)
系統(tǒng)監(jiān)控進(jìn)程SMON
Oracle數(shù)據(jù)庫至關(guān)重要的一個(gè)后臺(tái)進(jìn)程,SMON 是System Monitor 的縮寫,意即:系統(tǒng)監(jiān)控。
SMON的主要工作:
- 數(shù)據(jù)庫啟動(dòng)時(shí)的實(shí)例恢復(fù),在RAC環(huán)境下,一個(gè)節(jié)點(diǎn)的SMON可以對(duì)另外一個(gè)節(jié)點(diǎn)做實(shí)例恢復(fù)
- 清理和釋放臨時(shí)段上的數(shù)據(jù)(排序、臨時(shí)表…)
- 對(duì)于DMT(字典管理表空間),SMON可以合并連續(xù)空閑的extent
- 維護(hù)回滾段的online,offline以及空間的回收
進(jìn)程監(jiān)控進(jìn)程PMON
PMON是Process Monitor的縮寫,PMON主要有下面的用途:
- 在進(jìn)程非正常中斷后,做清理工作
- 在進(jìn)程abort后,PMON進(jìn)行清理工作。
- PMON的第三個(gè)用途是,向Oracle TNS listener注冊(cè)實(shí)例信息。
數(shù)據(jù)庫寫進(jìn)程DBWn
DBWn是Database writer的縮寫,n代表可以設(shè)置多個(gè)寫進(jìn)程。
DBWn負(fù)責(zé)把緩沖區(qū)的臟數(shù)據(jù)寫到磁盤上,DBW進(jìn)程是分散地把數(shù)據(jù)寫到磁盤上的。而LGWR是連續(xù)寫redo log。分散寫要比連續(xù)寫耗時(shí)的多。
DBWn觸發(fā)條件:
- 當(dāng)buffer cache空間不足時(shí)觸發(fā)。
- DBWn接到checkpoint的指令時(shí)觸發(fā)。
日志寫進(jìn)程LGWR
LGWR是把SGA中redo log buffer的信息寫到redo log file的進(jìn)程。LGWR是順序?qū)懭氲絩edo log file中,因此速度很快。LGWR會(huì)在下面情況發(fā)生:
1,每隔3秒鐘,進(jìn)行一次LGWR
2,任何事務(wù)進(jìn)行了commit操作
3,當(dāng)redo log buffer是1/3滿,或者里面有1MB的數(shù)據(jù)
基于以上的原因,把redo log buffer設(shè)置的很大就沒必要的。
檢查點(diǎn)進(jìn)程CKPT
CKPT是checkpoint的縮寫,根據(jù)checkpoint信息和DBW向磁盤寫數(shù)據(jù)塊的信號(hào),CKPT更新控制文件和數(shù)據(jù)文件頭。 Checkpoint information includes the checkpoint position, SCN, location in online redo log to begin recovery, and so on. CKPT 既不向數(shù)據(jù)文件中寫數(shù)據(jù)塊,也不向online redo log files寫redo塊。
歸檔進(jìn)程ARCn
ARCn,Archive歸檔進(jìn)程。ARCn的工作是在LGWR把onlone redo log填滿后,ARCn把redo log file的內(nèi)容copy到其他的地方。(也就是說是把聯(lián)機(jī)重做日志變成歸檔日志)。online redo log 是被用來為實(shí)例失敗的時(shí)候,恢復(fù)數(shù)據(jù)文件。而歸檔日志是被用來在media recovery的時(shí)候,恢復(fù)數(shù)據(jù)文件。
checkpoint和commit的區(qū)別
commit的作用是提交那些事務(wù)修改的數(shù)據(jù)產(chǎn)生的日志,即觸發(fā)LGWR將redo log buffer中的內(nèi)容寫到redo log files,此時(shí)并沒有把真正的數(shù)據(jù)寫到磁盤上。commit的目的就是為了寫到redo log files中去保護(hù)數(shù)據(jù)。
checkpoint會(huì)觸發(fā)DBWn進(jìn)程,將臟數(shù)據(jù)塊寫到數(shù)據(jù)文件中。如果DBWR進(jìn)程要將事務(wù)的結(jié)果寫入數(shù)據(jù)文件,但發(fā)現(xiàn)要寫入的臟數(shù)據(jù)塊相關(guān)的重做信息仍然處于重做日志緩存中,它將通知oracle啟動(dòng)LGWR進(jìn)程,先將這些重做信息寫入重做日志文件,直到重做信息全部被寫入后,DBWR進(jìn)程才開始將臟緩存寫入數(shù)據(jù)文件。所以checkpoint的目的是保證數(shù)據(jù)一致性。
參考:
Oracle官網(wǎng)-Managing the Oracle Instance
Oracle官網(wǎng)-Process Architecture
記得幫我點(diǎn)贊哦!
精心整理了計(jì)算機(jī)各個(gè)方向的從入門、進(jìn)階、實(shí)戰(zhàn)的視頻課程和電子書,按照目錄合理分類,總能找到你需要的學(xué)習(xí)資料,還在等什么?快去關(guān)注下載吧?。?!

念念不忘,必有回響,小伙伴們幫我點(diǎn)個(gè)贊吧,非常感謝。
我是職場(chǎng)亮哥,YY高級(jí)軟件工程師、四年工作經(jīng)驗(yàn),拒絕咸魚爭(zhēng)當(dāng)龍頭的斜杠程序員。
聽我說,進(jìn)步多,程序人生一把梭
如果有幸能幫到你,請(qǐng)幫我點(diǎn)個(gè)【贊】,給個(gè)關(guān)注,如果能順帶評(píng)論給個(gè)鼓勵(lì),將不勝感激。
職場(chǎng)亮哥文章列表:更多文章

本人所有文章、回答都與版權(quán)保護(hù)平臺(tái)有合作,著作權(quán)歸職場(chǎng)亮哥所有,未經(jīng)授權(quán),轉(zhuǎn)載必究!