Log Buffer
Log Buffer
一、Log Buffer的引入
? ? Oracle有一個(gè)原則:只要是已經(jīng)提交的數(shù)據(jù),就不會(huì)丟失,保證數(shù)據(jù)庫的一致性。這該如何實(shí)現(xiàn)?事物提交時(shí),直接寫入dbf中,效率是極低的。因?yàn)橹苯訉懭胛募到y(tǒng),buffer對(duì)應(yīng)的數(shù)據(jù)塊可能分布在文件系統(tǒng)的各個(gè)地方,提交時(shí)直接寫入,會(huì)有大量的IO和尋道時(shí)間,效率極低。同時(shí),數(shù)據(jù)庫在運(yùn)行過程中,不可避免的要遇到各種能夠?qū)е聰?shù)據(jù)塊庫損壞的情況。比如突然斷電、oracle或者操作系統(tǒng)的程序bug導(dǎo)致數(shù)據(jù)庫內(nèi)部邏輯結(jié)構(gòu)損壞、磁盤介質(zhì)損壞等,都有可能造成數(shù)據(jù)庫崩潰,從而導(dǎo)致數(shù)據(jù)丟失的現(xiàn)象發(fā)生。Oracle引入了Log Buffer的機(jī)制,完美的解決了以上兩個(gè)問題。
二、Log Buffer的實(shí)現(xiàn)原理
? ? Oracle在SGA中專門開辟一塊空間,用來存放Log Buffer。LogBuffer將所有數(shù)據(jù)庫中所有改變數(shù)據(jù)塊的操作,都原原本本的記錄下來。這些改變數(shù)據(jù)塊的操作不僅包括對(duì)數(shù)據(jù)表的DML或者對(duì)數(shù)據(jù)字典的DDL,還包括對(duì)索引的改變、對(duì)回滾段數(shù)據(jù)塊的改變、對(duì)臨時(shí)表空間的臨時(shí)段的改變等。只有將數(shù)據(jù)庫中所有的變化都記錄下來,當(dāng)發(fā)生數(shù)據(jù)庫損壞時(shí),才能夠從損壞時(shí)的那一點(diǎn)開始,將之后數(shù)據(jù)庫中的變化重新運(yùn)用一遍,從而達(dá)到恢復(fù)數(shù)據(jù)庫的目的。
1、日志記錄方式
(1)邏輯的記錄方式
????邏輯的記錄方式:也就是用描述性的語句來記錄整個(gè)變化過程。比如對(duì)于某個(gè)update更新操作來說來說,可以記錄為兩條語句:delete舊值以及insert新值。這種方式的優(yōu)點(diǎn)是非常節(jié)省空間,因?yàn)閷?duì)每個(gè)操作,只需要記錄幾條邏輯上的語句即可。但是缺點(diǎn)也很明顯,就是一旦需要進(jìn)行恢復(fù),就會(huì)非常消耗資源。設(shè)想一下,某個(gè)update操作更新了非常多的數(shù)據(jù)塊,由于buffer cache內(nèi)存有限,很多臟數(shù)據(jù)塊都已經(jīng)寫入了數(shù)據(jù)文件。但就在更新快結(jié)束時(shí),突然發(fā)生斷電,所做的更新丟失。那么重新啟動(dòng)實(shí)例時(shí),oracle需要應(yīng)用日志文件里的記錄,于是重新發(fā)出delete舊值以及insert新值的語句。這個(gè)過程需要重新查找數(shù)據(jù)文件中符合條件的數(shù)據(jù)塊,然后再挑出來進(jìn)行更新。這個(gè)過程將非常消耗時(shí)間,而且會(huì)占用大量的buffer cache。
(2)物理的記錄方式
????物理的記錄方式,也就是將每個(gè)數(shù)據(jù)塊改變前的鏡像和改變后的鏡像都記錄下來。這種方式優(yōu)點(diǎn)就是恢復(fù)起來速度非常快,直接根據(jù)日志文件里所記錄的數(shù)據(jù)塊地址和內(nèi)容更新數(shù)據(jù)文件中對(duì)應(yīng)的數(shù)據(jù)塊。但是缺點(diǎn)也很明顯,就是非常占用磁盤空間。
(3)ORACLE使用的日志記錄方式
? ? oracle采用了邏輯和物理相結(jié)合的方式。也就是說,oracle針對(duì)每個(gè)數(shù)據(jù)塊,記錄了插入某個(gè)值或者刪除某個(gè)值的描述語句。假如某個(gè)update更新了100個(gè)數(shù)據(jù)塊,則oracle會(huì)針對(duì)每個(gè)數(shù)據(jù)塊記錄一對(duì)delete舊值和insert新值的語句,共有100對(duì)這樣的描述語句。通過這種方式,oracle獲得了物理記錄方式的快速恢復(fù)的優(yōu)點(diǎn),同時(shí)又獲得了邏輯記錄方式的節(jié)省空間的優(yōu)點(diǎn)。
三、SQL提交過程分析
Oracle引入Log buffer之后,sql的執(zhí)行和提交過程如下:
?
?
修改數(shù)據(jù)Sql的執(zhí)行過程:
1、客戶端通過數(shù)據(jù)庫連接提交sql到oracle。
2、Oracle為該數(shù)據(jù)庫連接分配一個(gè)前臺(tái)進(jìn)程(Server Process),和PGA。
3、PGA計(jì)算sql的hash值,根據(jù)hash值查找shared pool中的Library Cache中,是否存在該sql對(duì)應(yīng)的執(zhí)行計(jì)劃。
4、如果有該sql對(duì)應(yīng)的執(zhí)行計(jì)劃,則跳到下一步。如果沒有,需要生產(chǎn)相應(yīng)的最優(yōu)執(zhí)行計(jì)劃,并將執(zhí)行計(jì)劃掛到Library Cache的相應(yīng)位置。
5、根據(jù)執(zhí)行計(jì)劃,查找需要的數(shù)據(jù),是否在buffer cache中,如果存在,則跳至下一步。如果沒有,PGA需發(fā)IO指令,到文件系統(tǒng)中加載相應(yīng)的數(shù)據(jù)塊到buffer cache中。
6、修改相應(yīng)的buffer。在修改的過程中,會(huì)生成相應(yīng)的日志,放入PGA中。當(dāng)積累到一定數(shù)量,PGA將日志寫入到log buffer中。
7、提交。提交時(shí),pga并不會(huì)調(diào)用DBWR寫入數(shù)據(jù)到文件系統(tǒng),而只是調(diào)用LGWR,將修改日志按順序的記錄到文件系統(tǒng)中。由于是按照順序記錄,所以比直接將buffer寫入到dbf文件的速度快很多,因?yàn)楣?jié)省了磁盤的尋道時(shí)間。
????因?yàn)?/span>log buffer空間小,提交頻繁,所以,此種提交方式,保證了數(shù)據(jù)的一致性。就算數(shù)據(jù)庫掉電,沒有來得及將臟buffer寫入dbf中,也能保證已提交的數(shù)據(jù)不會(huì)丟失。因?yàn)槿罩疚募4媪怂械?/span>buffer的變更,所以,根據(jù)日志文件,都能跑出已經(jīng)提交的數(shù)據(jù),并提交。
四、LGWR觸發(fā)條件:
1、用戶提交
2、有1/3的重做日志緩沖區(qū)未被寫入磁盤
3、有大于1M的緩存沒有寫入磁盤
4、write-ahead-log日志寫入優(yōu)先 ?dbwr需要寫入數(shù)據(jù)的scn大于lgwr記錄的scn,dewr觸發(fā)lgwr寫入。
5、發(fā)生日志切換時(shí)觸發(fā)LGWR。
6、每3秒調(diào)用一次。
五、日志系統(tǒng)的意義
1、大幅提高commit的速度
? ? 為何?Oracle提交時(shí),調(diào)用的是日志提交。日志提交比直接寫入dbf快在哪?因?yàn)橛?jì)算機(jī)系統(tǒng)的瓶頸就是IO,而IO的瓶頸是磁頭的尋道時(shí)間。由于日志記錄到redo log中是按順序記錄的,而block是分布在dbf文件的各個(gè)角落。所以,寫入block會(huì)有很多的磁頭尋道時(shí)間。因此,日志存檔會(huì)比數(shù)據(jù)入庫快很多。
? ?這里引出另一個(gè)問題。Redo log,一般是放在存儲(chǔ)上。那應(yīng)該放置在什么樣的磁盤上呢?這里建議:redo log 日志,需要放到io/ps 很高的磁盤上,因?yàn)閷懙暮茴l繁,量少,順序?qū)?#xff0c;不要放到red5、red6上。可以放在read10 或者read01上,最好放在固態(tài)盤上。
2、成就buffer cache的寫緩存
? ? ?計(jì)算機(jī)系統(tǒng)中,所涉及的緩存,一般都只有緩存讀。每當(dāng)要寫入的時(shí)候,都是直接針對(duì)文件系統(tǒng)中的文件進(jìn)行操作。而如果,直接多次修改緩存,就能實(shí)現(xiàn)對(duì)文件的修改,這種緩存,就叫做寫緩存。存儲(chǔ)上的緩存和oracle 的buffer cache就是典型的寫緩存。
? 因?yàn)橛腥罩鞠到y(tǒng)的存在,server process在提交的時(shí)候,不必每次的調(diào)用DBWR將修改的臟buffer寫入到dbf中,而只需將該buffer加入到LRUW鏈表中,不用擔(dān)心buffer的改動(dòng)沒有保存導(dǎo)致數(shù)據(jù)丟失。這樣就實(shí)現(xiàn)了buffer cache的寫緩存。
?
轉(zhuǎn)載于:https://www.cnblogs.com/ironyoda/p/6051387.html
總結(jié)
以上是生活随笔為你收集整理的Log Buffer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TypeScript中的枚举类型
- 下一篇: 屠龙之路_战胜View对DataBase