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