Mysql系列之 日誌

2021-10-12 10:20:55 字數 2192 閱讀 3896

tip:生活不易,碼農辛苦

我是小刀,在網際網路中夾縫求生 我希望你開心…

redo log(重做日誌)和binlog(歸檔日誌)。

redo log 像一塊「粉板」。更新的時候,先寫到 redo log 和記憶體裡,這次更新就算是結束了。等到合適的時機再寫到磁碟裡,大大減小了寫磁碟的次數。

redo log 是固定大小、「迴圈寫」的,就像粉板一樣,頂多也就記個十幾二十條,多了就記不下了,這時會把粉板上的帳都寫到賬本裡,再擦掉粉板,從頭開始記。假設 redo log 配置了4組檔案,每個檔案 1g ,一共可記錄 4g 的操作,寫滿了就會擦掉一部分記錄。

redo log 是物理日誌,記錄的是「在某個資料頁上做了什麼修改」。

在做更新操作時,如果每一次更新操作都立即寫進磁碟,那麼整個過程io成本、查詢成本都很高。redo log就是為了解決這一問題,mysql通過wal(write-ahead logging)技術,先把更新操作寫入redo log日誌,並更新記憶體,這時更新操作就完成了,同時innodb引擎會在適當的時候(系統比較空閒時),將一批操作更新到磁碟裡面。如果redo log寫滿時,就不能再執行新的更新,得停下來先擦掉redo log一些記錄,寫入磁碟,再執行新的更新。

有了redo log,innodb就可以保證即使資料庫發生異常重啟,之前提交的記錄都不會丟失,這個能力稱為crash-safe

1.redo log 是 innodb 引擎特有的;binlog是mysql的server層實現的,所有引擎都可以使用

2.redo log是物理日誌,記錄的是「在某個資料頁上做了什麼修改」;

3.binlog是邏輯日誌,記錄的是這個語句的原始邏輯,比如「給id=2這一行的c欄位加1」。

4.binlog兩種模式:statement格式記錄sql語句,row格式記錄行的內容,兩條(更新前和更新後)。

5.redo log 是迴圈寫的,空間固定會用完;binlog是可以追加寫入的。「追加寫」是指binlog檔案寫到一定大小後會切換到下乙個,並不會覆蓋以前的日誌。

其實 redo log 才是那個新來的仔。mysql 自帶了 binlog 日誌用於歸檔,沒有 crash-safe 的能力。innodb 引擎以外掛程式的形式引入 mysql 時,為了能夠實現 crash-safe 的能力,引入了 redo log 。

一般我們用 binlog 做主從複製,資料恢復等操作。

將redo log的寫入拆成了兩個步驟:prepare 和 commit,這就是「兩階段提交」。

「兩階段提交」的目的是為了讓兩份日誌之間的邏輯一致。保證一致性。

資料恢復過程:

首先,找到最近的一次全量備份,從這個備份恢復到臨時庫;

然後,從備份的時間點開始,將備份的binlog依次取出來,重放到中午誤刪表之前的那個時刻。

最後把錶資料從臨時庫取出來,按需要恢復到線上庫去。

為什麼需要兩階段提交?

我們先假設沒有兩階段提交時,可能會有以下兩種情況:

1. redo log 提交成功了,這時候資料庫掛掉導致 binlog 沒有成功寫入。資料庫重啟之後通過 redo log 把資料恢復回來,但是 binlog 沒有成功寫入,導致我們在做主從複製或者資料恢復的時候,資料不一致。

2. binlog 提交成功了,這時候資料庫掛掉導致 redo log 沒有成功寫入。資料庫重啟之後,無法恢復崩潰之前提交的那個事務,這部分資料更改在主庫缺失。但是 binlog 已經成功寫入了,從庫反而有了該事務的改動,導致資料不一致。

綜上我們知道,redo log 和 binlog 必須同時成功或同時失敗,才能保證資料一致性。

乙個事務的 binlog 是有完整的格式的:

statement 格式的 binlog,最後會有 commit;

row 格式的 binlog,最後會有乙個 xid event。

mysql 日記 mysql之日誌

我是李福春,我在準備面試,今天的題目是 mysql的redolog和binlog有什麼區別?答 如下面的 然後我們擴充套件一下,因為日誌主要是記錄的修改日誌,分別加深分析一下 redolog redolog是innodb儲存引擎特有的物理日誌,記錄的是資料頁做了什麼改動。它的儲存空間是固定的,類似乙...

mysql日誌恢復 Mysql之日誌恢復

對於mysql,每一步操作都會有相應記錄,如insert,update,delete drop alter等相關ddl或dml操作。有時難免會出錯,但在出錯時如何恢復以復原資料。例如,現在有這些資料 但被我truncate了。需要緊急恢復。首先,確保開啟了binlog輸出 然後,找到當前日誌檔案,使...

MySQL歷史更新 mysql之日誌

我是李福春,我在準備面試,今天的題目是 mysql的redolog和binlog有什麼區別?答 如下面的 redolog vs binlog 然後我們擴充套件一下,因為日誌主要是記錄的修改日誌,分別加深分析一下 redolog redolog是innodb儲存引擎特有的物理日誌,記錄的是資料頁做了什...