Mysql的各種log(binlog、redo log、undo log)

MySQL常見的三種log:

  • binlog
  • redolog
  • undolog

binlog

什麼是binlog

binlog是在mysql的服務層產生的

binlog記錄了數據庫表結構和表數據變更,它不會記錄select(因爲這沒有對錶沒有進行變更)

可以簡單理解爲:存儲着每條變更的SQL語句(可能不止SQL,還有XID「事務Id」等等)

在這裏插入圖片描述

用途

主要有兩個作用:複製恢復數據

  • MySQL使用一主多從結構時,從服務器需要與主服務器的數據保持一致,通過binlog來實現的
  • 可以通過binlog對數據進行恢復

redo log

redo log是在innodb即存儲引擎層產生的

Mysql的基本存儲結構是頁(記錄都存在頁裏邊),所以MySQL是先把這條記錄所在的頁找到,然後把該頁加載到內存中,將對應記錄進行修改

那就可能存在一個問題:如果在內存中把數據改了,還沒來得及落磁盤,而此時的數據庫掛了怎麼辦?

在這裏插入圖片描述
肯定不能每次修改就更新到磁盤,但是不更新到磁盤又怕有數據丟失的風險。InnoDB引入了redolog:內存寫完了,會寫一份redolog(記載着這次在某個頁上做了什麼修改)

寫redo log的時候,也會有buffer,是先寫buffer,再真正落到磁盤中的。至於從buffer什麼時候落磁盤,會有配置供我們配置。

寫redo log也是需要寫磁盤的,但它的好處就是順序IO(順序IO比隨機IO快非常多)。

當我們修改的時候,寫完內存了,但數據還沒真正寫到磁盤的時候。此時我們的數據庫掛了,我們可以根據redo log來對數據進行恢復。因爲redo log是順序IO,所以寫入的速度很快,並且redo log記載的是物理變化(xxxx頁做了xxx修改),文件的體積很小,恢復速度很快。

binlog和redo log

區別:

存儲內容

binlog記載的是update/delete/insert這樣的SQL語句,而redo log記載的是物理修改的內容(xxxx頁修改了xxx)。

redo log 記錄的是數據的物理變化binlog 記錄的是數據的邏輯變化

功能

redo log是爲持久性、恢復數據用的,而binlog不僅可以用於恢復數據,還用於主從複製。

redo log是一個環形結構,是有限的,數據刷到磁盤後redo log就無效,如果redo log滿了,mysql還得停一下來刷新數據到磁盤,也就是刷髒頁。

寫入細節

redo log是MySQL的InnoDB引擎所產生的。

binlog無論MySQL用什麼引擎,都會有的。

InnoDB事務的持久性就是靠redo log來實現的(如果寫入內存成功,但數據還沒真正刷到磁盤,如果此時的數據庫掛了,我們可以靠redo log來恢復內存的數據,這就實現了持久性)

redo log事務開始的時候,就開始記錄每次的變更信息,而binlog是在事務提交的時候才記錄。

問題出現了:寫其中的某一個log,失敗了,那會怎麼辦?現在我們的前提是先寫redo log,再寫binlog,我們來看看:

  • 如果寫redo log失敗了,那我們就認爲這次事務有問題,回滾,不去寫binlog。

  • 如果寫redo log成功了,寫binlog,寫binlog寫一半了,但失敗了怎麼辦?我們還是會對這次的事務回滾,將無效的binlog給刪除(因爲binlog會影響從庫的數據,所以需要做刪除操作)

  • 如果寫redo log和binlog都成功了,那這次算是事務纔會真正成功。

簡單來說:MySQL需要保證redo log和binlog的數據是一致的,如果不一致,那就亂套了。

  • 如果redo log寫失敗了,而binlog寫成功了。那假設內存的數據還沒來得及落磁盤,機器就掛掉了。那主從服務器的數據就不一致了。(從服務器通過binlog得到最新的數據,而主服務器由於redo log沒有記載,沒法恢復數據)。而且Mysql迅速恢復的時候redo log沒有這條信息,而binlog又有,如果用binlog去恢復數據,會讓Mysql看起來像是多做了一些事。

  • 如果redo log寫成功了,而binlog寫失敗了。那從服務器就拿不到最新的數據了,而且以後做數據備份的時候也會丟失了這條記錄。

MySQL通過兩階段提交來保證redo log和binlog的數據是一致的。

過程:

  • 階段1:redo log 寫盤,處於 prepare 狀態

  • 階段2:binlog 寫盤,redo log 處於 commit 狀態

undo log

undo log主要有兩個作用:回滾多版本控制(MVCC)

在數據修改的時候,不僅記錄了redo log,還記錄undo log,如果因爲某些原因導致事務失敗或回滾了,可以用undo log進行回滾(保證了原子性)

undo log主要存儲的是邏輯日誌,用來回滾的相反操作日誌。比如我們要insert一條數據了,那undo log會記錄的一條對應的delete日誌。我們要update一條記錄時,它會記錄一條對應相反的update記錄。

因爲undo log存儲着修改之前的數據,相當於一個前版本,MVCC實現的是讀寫不阻塞,讀的時候只要返回前一個版本的數據就行了。

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