MySQL 重做日誌 redo log 原理

2021-08-19 14:43:30 字數 2959 閱讀 5632

【redo log buffer】【redo log file】-原理

目錄:1.重做日誌寫入過程圖

2.相關知識點彙總圖

3.redo_log_buffer 原理

4.redo_log_file 原理

1. 重做日誌寫入過程:

3.redo log buffer 原理

重做日誌緩衝(redo log buffer)是innodb儲存引擎的記憶體區域中的一部分。

【重做日誌資訊--(1)-->redo log buffer--(2)-->重做日誌檔案】

在(2)中涉及知識:

<1>.關於innodb_log_buffer_size的大小:(預設8m)

mysql> show variables like 'innodb_log_buffer_size%';

+------------------------+---------+

| innodb_log_buffer_size | 8388608 |

+------------------------+---------+

8388608(byte)/1024/1024=8m

重做日誌緩衝不需要設定的太大,只要保證每秒產生的事務量在緩衝大小範圍之內。因為每秒都會重新整理緩衝到日誌檔案。8m足夠了。

<2>.在以下三種情況下,會將重做日誌緩衝中的內容重新整理到外部磁碟的重做日誌檔案中。

master thread 每一秒將重做日誌緩衝重新整理到重做日誌檔案;

每個事務提交時會將重做日誌緩衝重新整理到重做日誌檔案;

當重做日誌緩衝池剩餘空間小於1/2時,重做日誌緩衝重新整理到重做日誌檔案。

4. redo log file 原理

<1>.重做日誌介紹

日誌檔名:

1.innodb_log_group_home_dir引數指定的目錄下有兩個檔案:ib_logfile0,ib_logfile1

2.該檔案被稱為:重做日誌檔案(redo log file),記錄innodb儲存引擎的事務日誌。至關重要!!!

3.例如:伺服器意外宕機導致例項失敗,innodb儲存引擎利用重做日誌恢復到宕機前的狀態,以此保證資料的完整性。

日誌檔案組:

1.每個innodb儲存引擎至少有1個重做日誌檔案組,每個組至少包含2個重做日誌檔案(ib_logfile0,ib_logfile1).

2.可以通過設定多個映象日誌組(mirrored log groups),將不同組放到不同磁碟,提高重做日誌的高可用性。

3.日誌組中的檔案大小是一致的,以迴圈的方式執行。檔案1寫滿時,切換到檔案2,檔案2寫滿時,再次切換到檔案1.

日誌檔案引數:

1.innodb_log_file_size 重做日誌檔案的大小。

2.innodb_log_files_in_group 指定重做日誌檔案組中檔案的數量,預設2

3.innodb_mirrored_log_groups 指定了日誌映象檔案組的數量,預設1

4.innodb_log_group_home_dir 指定日誌檔案組所在的路徑,預設./ ,表示在資料庫的資料目錄下。

<2>.重做日誌檔案大小設定

太大:恢復時可能需要很長時間

太小:可能導致乙個事務需要多次切換重做日誌檔案;會導致async checkpoint,導致效能抖動。

錯誤日誌警告資訊:

innodb:error:the age of the last checkpoint is 9433645,innodb:which exceeds the log group capacity 9433498.

解析:重做日誌有個capacity變數,代表最後的檢查點不能超過這個閾值,如果超過,必須將緩衝池中髒頁列表(flush list)中的部分髒資料頁寫回磁碟,這是會導致使用者執行緒的阻塞。

<3>.二進位制日誌和重做日誌的對比:

1.類別

二進位制日誌:記錄mysql資料庫相關的日誌記錄,包括innodb,myisam等其它儲存引擎的日誌。

重做日誌:只記錄innodb儲存引擎本身的事務日誌

2.內容

二進位制日誌:記錄事務的具體操作內容,是邏輯日誌

重做日誌:記錄每個頁的更改的物理情況

3.時間

二進位制日誌:只在事務提交完成後進行寫入,只寫磁碟一次,不論這時事務量多大。

重做日誌:在事務進行中,就不斷有重做日誌條目(redo entry)寫入重做日誌檔案。

<4>.重做日誌條目

1.條目基本格式

redo_log_type (1位元組)

space (壓縮後可能<4位元組)

page_no

redo_log_body

reod_log_type: 占用1位元組,表示重做日誌型別。各種不同操作有不同的重做日誌格式,但有基本的格式。

space:表空間的id,採用壓縮的方式,占用空間可能小於4位元組。

page_no:頁的偏移量,同樣採用壓縮方式

redo_log_body:每個重做日誌的資料部分,恢復時需要呼叫相應的函式解析。

<5>.寫入過程

1.重做日誌資訊 先寫入 重做日誌緩衝 再按一定條件順序寫入重做日誌檔案!

2.redo log buffer 向 redo log file 寫,是按512個位元組,也就是乙個扇區的大小進行寫入。扇區是寫入的最小單位,一定能寫入成功,因此過程中不需要double write.

MySQL重做日誌

用來實現事物的永續性,即事務acid中的d。重做日誌有兩部分組成 當事務commit時,必須將事務的全部日誌寫入重做日誌檔案進行持久化,待完成後事務commit的操作才算完成,即日誌前寫規則。為確保每次日誌都寫入到重做日誌檔案,在每次寫入後都進行一次fsync操作。因為重做日誌檔案沒有使用o dir...

mysql重做日誌

mysql預設情況下會有兩個檔案 ib logfile0和ib logfile1,這兩個檔案就是重做日誌檔案,或者事務日誌。重做日誌的目的 萬一例項或者介質失敗,重做日誌檔案就能派上用場。每個innodb儲存引擎至少有乙個重做日誌檔案組,每個檔案組下至少有2個重做日誌檔案,如預設的ib logfil...

MYSQL 重做日誌

主要作用 1.當資料庫例項或網路介質出問題,重做日誌能夠進行恢復,保證innodb引擎資料的完整性 內部構成 1.每個innodb儲存引擎至少有乙個重做日誌檔案組 group 2.每個日誌檔案組下至少有兩個重做日誌檔案,預設為ib logfile0 ib logfile1 3.可以設定多個映象日誌檔...