Checkpoink技術

 

redo可以看做,InnoDB用於自我的數據修復,明顯的例子就是:意外宕機恢復到宕機前的狀態,這個過程不是人爲手動可以干預的。
換句話說,有redo,可以最大限度保證InnoDB的自我修復,沒有redo,可能恢復就會出問題。
有與沒有,都不是手動可以直接操作這個文件的。redo可以看做InnoDB穩定運行的一個前提條件。
可以想象下,沒有redo,難道每次宕機後,都要想法去找丟失的那部分數據嗎。redo 就可以看做是記錄,這部分數據的文件。

binlog : 基於人爲操作的數據恢復,手動去恢復數據。但是,對於InnoDB運行來說,binlog的存在是必須的前提條件嗎? 不是。你可以不開啓binlog。數據庫依然可以運行。可以說binlog是手動恢復數據的一種手段,此外也是用於主從數據同步。
由此,可見,前者存在是必要條件,而後者是非必要條件。

 

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>.在以下三種情況下,會將重做日誌緩衝中的內容刷新到外部磁盤的重做日誌文件中。

  1. Master Thread 每一秒將重做日誌緩衝刷新到重做日誌文件;
  2. 每個事務提交時會將重做日誌緩衝刷新到重做日誌文件;
  3. 當重做日誌緩衝池剩餘空間小於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>.重做日誌文件大小設置

  1. 太大:恢復時可能需要很長時間
  2. 太小:可能導致一個事務需要多次切換重做日誌文件;會導致async checkpoint,導致性能抖動。
  3. 錯誤日誌警告信息:

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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章