1. 程式人生 > 實用技巧 >MySQL 事務日誌

MySQL 事務日誌

重做日誌(Redo log)

重做日誌(Redo log),也叫做前滾日誌,存放在如下位置,輪詢使用,記錄著記憶體中資料頁的變化,在事務 ACID 過程中,主要實現的是 D(Durability)的作用,對於 A(Atomicity)C(Consistency) 也有相應的作用

# Redo Log 日誌檔案的位置
# ib_logfile0 與 ib_logfile1 輪詢使用,預設 48MB
[root@db01 data]# ll /application/mysql/data/
-rw-rw---- 1 mysql mysql 50331648 Aug 15 06:34 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Mar  6  2017 ib_logfile1

Redo Log 日誌中,記錄著記憶體中的資料頁的變化過程(不是 SQL 語句),以及資料頁當前的 LSN(Log Sequence Number)日誌序列號

Redo Log Buffer:記錄資料頁的變化過程的記憶體緩衝區,資料頁當前的 LSN(Log Sequence Number)日誌序列號

Data Page Buffer Pool:當執行 DML 時,MySQL 將資料(至少一頁 16K)取到該資料緩衝記憶體中,在當前記憶體中修改該資料,並將變化的過程儲存到 Redo Buffer 中,修改完資料不會馬上儲存回硬碟,因為每一條 DML 語句都至少調取一頁資料(16K),儲存時也至少儲存一頁資料(16K)。若執行大量的 DML 會進行大量的 IO 操作

LSN(Log Sequence Number)日誌序列號:日誌序列號,佔用 8 位元組,主要用於發生 Crash 時對資料進行 Recovery,LSN 是一個一直遞增的整型數字,表示事務寫入到日誌的位元組總量
CSR(Crash Recovery-safety)故障自動恢復:出現宕機,即使磁碟中的zzzwqh.ibd檔案中沒有儲存資料,根據 redo log 也可以恢復資料。
CSR(Crash Recovery-safety)故障自動恢復過程:重啟資料庫時,MySQL 將 .ibd 檔案取到 Data Buffer Page Pool 記憶體中,將 redo log 取到 Redo Buffer 記憶體中,對比兩者的 LSN(Log Sequence Number)日誌序列號,將變化後的資料真正落入到 .ibd 檔案中,所以很多時候重啟資料庫會很慢

WAL(Write Ahead Log)日誌優先寫:Redo log 要比資料要優先寫入磁碟中,因為 IO 速率更快

舉例描述流程

# 修改
1)首先將表中 id=1 的行所在資料頁(16K)載入到記憶體中 Data Page Buffer Pool 
2)MySQL例項在記憶體中將 id=1 的資料改成 id=2
3)id=1 變成 id=2 的變化過程會記錄到,redo 記憶體區域,也就是 Redo Buffer Pool
4)當敲下 commit 命令的瞬間,MySQL會將 Redo Buffer Pool 寫入磁碟區域 Redo Log
5)當寫入成功之後,commit 返回 ok,commit 一般很快,因為需要寫的 Log 資料很少(相對於表資料)

# 查詢
1.首先將表中 id=1 的行所在資料頁載入到記憶體中 Data Page Buffer Pool 
2.將 Redo Log 中 id=1 變成 id=2 的變化過程取載入到  Redo Buffer Pool
3.通過  Data Page Buffer Pool 和 Redo Buffer Pool 得到一個結果