DBWR與LGWR的寫入機制

讀與寫是每個數(shù)據(jù)庫提供的最基本的功能凸郑。當數(shù)據(jù)庫中出現(xiàn)第一個進程時,總免不了要將數(shù)據(jù)從磁盤上加載到內(nèi)存中,一次數(shù)據(jù)庫的物理I/O由此發(fā)生速兔。而這對應著數(shù)據(jù)庫的讀事件坛怪。通常大多數(shù)情況下淤齐,數(shù)據(jù)庫中不僅會伴隨著大量的讀,也會產(chǎn)生大量的寫入更新操作袜匿,而類似寫入更新的操作則需要將修改后的數(shù)據(jù)寫回到磁盤中更啄。

顯然,對于讀操作來說居灯,總是依據(jù)需要讀取數(shù)據(jù)的請求從磁盤上或內(nèi)存中找到對應滿足的數(shù)據(jù)返回給客戶端祭务。也就是說,讀操作必定是伴隨著客戶端會話的請求而出現(xiàn)的怪嫌。那么义锥,寫操作在數(shù)據(jù)被更新/修改后是如何寫回到磁盤中的?

Oracle實例在啟動時在內(nèi)存中劃分了一塊區(qū)域岩灭,被稱作 SGA(System Global Area,系統(tǒng)全局區(qū))拌倍。其中共有6大內(nèi)存區(qū)域,緩沖數(shù)據(jù)庫中的數(shù)據(jù)部分的內(nèi)存區(qū)域則稱為 Database Buffer Cache(數(shù)據(jù)庫高速緩存區(qū))噪径。

Database Buffer Cache 主要用來提高數(shù)據(jù)的訪問性能柱恤,避免訪問數(shù)據(jù)庫過程中出現(xiàn)大量的磁盤讀寫≌野可見梗顺,Database Buffer Cache 存在的意義不僅在于緩存數(shù)據(jù)庫中讀的數(shù)據(jù),而且需要提升數(shù)據(jù)庫的寫性能车摄。既然如此荚守,數(shù)據(jù)被修改或更新后也不是立刻會寫回到磁盤中的,而應該有一定的規(guī)則將數(shù)據(jù)緩存區(qū)中的數(shù)據(jù)寫回到磁盤中练般。而實現(xiàn)這一機制的矗漾,則是 DBWR(Database Writer)

后臺進程-DBWR

DBWR 是Oracle數(shù)據(jù)庫中的一個后臺進程薄料,用于將 Database Buffer Cache 中的被修改的數(shù)據(jù)寫回到磁盤中敞贡。在數(shù)據(jù)庫中,數(shù)據(jù)最先從磁盤上讀取數(shù)據(jù)并加載到內(nèi)存中摄职,此時的數(shù)據(jù)并沒有被任何的用戶進程修改過誊役,這種類型的數(shù)據(jù)稱為 Cleaning Data获列。而當數(shù)據(jù)庫中的數(shù)據(jù)被用戶進程修改了某些字段的值后,因為數(shù)據(jù)是在內(nèi)存中被修改的蛔垢,修改后的數(shù)據(jù)(內(nèi)存中)因為與磁盤上的數(shù)據(jù)文件中記錄的數(shù)據(jù)已經(jīng)發(fā)生了不同击孩,因此這部分被修改過的數(shù)據(jù)被稱為 Dirty Data。當內(nèi)存區(qū)域中的 Dirty DataDBWR 進程寫入到磁盤上后鹏漆,數(shù)據(jù)文件又恢復 Clenaing 狀態(tài)巩梢,這個過程稱為 刷臟

內(nèi)存中的數(shù)據(jù)是無論如何也要寫回到磁盤中的艺玲,這一點是確定無疑的括蝠。但更困難的問題在于以什么樣的機制將數(shù)據(jù)寫回到磁盤。

針對這個問題饭聚,或許有很多中解決方案忌警。或者寫入發(fā)生在數(shù)據(jù)修改的那一刻秒梳,或者定時定量將數(shù)據(jù)寫回到磁盤法绵,或者由其他機制(進程)觸發(fā)寫入操作,或許都是可行的方案酪碘。

先說說寫入發(fā)生在數(shù)據(jù)修改的那一刻的情況朋譬,這種情況下數(shù)據(jù)庫中發(fā)生一次數(shù)據(jù)修改后,就需要立刻將數(shù)據(jù)寫回到磁盤中婆跑。顯然,一旦這么做會在數(shù)據(jù)庫中產(chǎn)生大量的物理寫入庭呜,而過多的物理I/O會降低數(shù)據(jù)庫的性能滑进,顯然,修改即寫入無法滿足數(shù)據(jù)庫的性能要求募谎,但這種方式或許是保障數(shù)據(jù)不會丟失的好辦法扶关。

接著是定時定量將內(nèi)存中的數(shù)據(jù)寫回到磁盤中,這種方式也是 DBWR 機制中的一種数冬。與修改即寫入不同的是节槐,被修改的數(shù)據(jù)會在內(nèi)存中保留一段時間,直到達到數(shù)據(jù)庫后臺進程 DBWR 設定(默認)的時間閾值后拐纱,一次將內(nèi)存中被修改的數(shù)據(jù)塊寫回到磁盤中铜异。相比修改即寫入,定時定量將內(nèi)存區(qū)域被修改的數(shù)據(jù)塊則可以避免可能發(fā)生在數(shù)據(jù)庫中的大量物理I/O問題秸架,從而提高數(shù)據(jù)庫的訪問性能揍庄。

DBWR 后臺進程中也是定時定量對 數(shù)據(jù)庫高速緩存區(qū) 中的數(shù)據(jù)進行寫回到磁盤操作的。在Oracle中东抹,DBWR 每隔3s啟動一次進程將數(shù)據(jù)寫回到磁盤中蚂子;另一種情況是當內(nèi)存中的臟數(shù)據(jù)塊占比達到一定限制后沃测,也會觸發(fā) DBWR 進程將臟數(shù)據(jù)刷回到磁盤中去。

再來說按規(guī)則(機制)將內(nèi)存中的數(shù)據(jù)寫回到磁盤的情況食茎。這種方式類似于定時定量的方式蒂破,都是以某一種設定條件作為觸發(fā) DBWR 寫數(shù)據(jù)的依據(jù)。在Oracle中别渔,則是使用 CKPT 檢查點作為觸發(fā) DBWR 的條件附迷。

當數(shù)據(jù)庫發(fā)生檢查點事件時,后臺進程 DBWR 會被啟動钠糊,并將當前內(nèi)存區(qū)域中的臟數(shù)據(jù)統(tǒng)一寫回到磁盤中的數(shù)據(jù)文件挟秤。數(shù)據(jù)中的檢查點回周期性的執(zhí)行,以此保證內(nèi)存中的數(shù)據(jù)可以有效的被寫回磁盤抄伍。

后臺進程-LGWR

數(shù)據(jù)庫中 DBWR 進程觸發(fā)時艘刚,會響應啟動另一個后臺進程-LGWR,用于將數(shù)據(jù)庫中數(shù)據(jù)變更的歷史記錄到日志文件中截珍。并且攀甚,DBWR 后臺進程在 LGWR 進程寫入重做日志期間會保持阻塞狀態(tài),當 LGWR 寫入日志完成后岗喉,DBWR 開始將內(nèi)存中的數(shù)據(jù)寫入到磁盤中秋度。

SGA 內(nèi)存區(qū)中,保存重做日志的區(qū)域稱為 Redo Log Buffer(重做日志緩存區(qū))钱床,當需要將數(shù)據(jù)修改對應的日志記錄到日志文件中時荚斯,會觸發(fā) LGWR 后臺進程將緩存區(qū)的日志寫入到重做日志文件中。

在Oracle數(shù)據(jù)庫中查牌,日志的完整性是十分重要的事期。絕不僅僅只是記錄,當實例異常故障后再恢復時需要應用重做日志文件纸颜,將數(shù)據(jù)庫恢復到故障前一刻的狀態(tài)兽泣。只有被寫入重做日志中的數(shù)據(jù),在內(nèi)存區(qū)域被修改的數(shù)據(jù)才算是安全的胁孙。

與數(shù)據(jù)何時寫回到磁盤一樣唠倦,數(shù)據(jù)庫日志緩存區(qū)的日志也需要根據(jù)一定的規(guī)則將日志文件記錄到重做日志文件中。觸發(fā) LGWR 進程寫入日志的情況包含以下幾種:

當用戶進程執(zhí)行了 rollback(回滾)commit(提交) 事件時涮较,數(shù)據(jù)庫會啟動后臺的 LGWR 進程稠鼻,將相應的數(shù)據(jù)變更的記錄記錄到聯(lián)機重做日志文件中;同樣狂票,當內(nèi)存區(qū)域的日志緩存區(qū)的空間不夠用時枷餐,也會觸發(fā) LGWR 后臺進程將日志緩存區(qū)的日志寫入到重做日志中。

DBWR 一樣,LGWR 也會每隔3s將日志緩存區(qū)的日志寫入到重做日志中毛肋。

redo log buffer 內(nèi)存區(qū)域的日志占用的空間達到一定限制后(默認超過日志緩存區(qū)1/3的空間時)怨咪,觸發(fā) LGWR 后臺進程開始將緩存區(qū)的日志寫入到重做日志中。

最后润匙,LGWR 寫日志時會根據(jù)日志出現(xiàn)的先后順序?qū)?nèi)存區(qū)域的日志順序的寫入到日志文件中诗眨,是為了數(shù)據(jù)庫恢復時按照數(shù)據(jù)被修改的先后順序應用redo,保證數(shù)據(jù)的正確性和一致性孕讳。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匠楚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厂财,更是在濱河造成了極大的恐慌芋簿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璃饱,死亡現(xiàn)場離奇詭異与斤,居然都是意外死亡,警方通過查閱死者的電腦和手機荚恶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門撩穿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谒撼,你說我怎么就攤上這事食寡。” “怎么了廓潜?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵抵皱,是天一觀的道長。 經(jīng)常有香客問我辩蛋,道長呻畸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任堪澎,我火速辦了婚禮擂错,結果婚禮上味滞,老公的妹妹穿的比我還像新娘樱蛤。我一直安慰自己,他們只是感情好剑鞍,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布昨凡。 她就那樣靜靜地躺著,像睡著了一般蚁署。 火紅的嫁衣襯著肌膚如雪便脊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天光戈,我揣著相機與錄音哪痰,去河邊找鬼遂赠。 笑死,一個胖子當著我的面吹牛晌杰,可吹牛的內(nèi)容都是我干的跷睦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肋演,長吁一口氣:“原來是場噩夢啊……” “哼抑诸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爹殊,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蜕乡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梗夸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體层玲,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年绒瘦,在試婚紗的時候發(fā)現(xiàn)自己被綠了称簿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡惰帽,死狀恐怖憨降,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情该酗,我是刑警寧澤授药,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站呜魄,受9級特大地震影響悔叽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爵嗅,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一娇澎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睹晒,春花似錦趟庄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锉试,卻和暖如春猫十,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工拖云, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贷笛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓宙项,卻偏偏與公主長得像昨忆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杉允,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容