Oracle內(nèi)存結(jié)構(gòu)和后臺(tái)進(jìn)程

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)注下載吧?。?!

resource-introduce

念念不忘,必有回響,小伙伴們幫我點(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)亮哥文章列表:更多文章

wechat-platform-guide-attention

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容