女朋友說:你要搞懂了MySQL三大日誌,我就讓你嘿嘿嘿!

来源:https://www.cnblogs.com/yidengjiagou/archive/2022/06/30/16428990.html
-Advertisement-
Play Games

MySQL實現事務、崩潰恢復、集群的主從複製,底層都離不開日誌,所以日誌是MySQL的精華所在。只有瞭解MySQL日誌,才算是徹底搞懂MySQL。 今天一燈就帶你深入淺出的學習MySQL的三大日誌系統,Redo Log(重做日誌)、Undo Log(恢復日誌)、Bin Log(備份日誌)。 ...


1. 背景

MySQL實現事務、崩潰恢復、集群的主從複製,底層都離不開日誌,所以日誌是MySQL的精華所在。只有瞭解MySQL日誌,才算是徹底搞懂MySQL。

今天一燈就帶你深入淺出的學習MySQL的三大日誌系統,Redo Log(重做日誌)Undo Log(恢復日誌)Bin Log(備份日誌)

2. Redo Log(重做日誌)

2.1 Redo Log的內容與作用

Redo Log 記錄的是物理日誌,也就是磁碟數據頁的修改。

作用: 用來保證服務崩潰後,仍能把事務中變更的數據持久化到磁碟上。

MySQL事務中持久性就是使用Redo Log實現的。

2.2 什麼時候寫入Redo Log?

  1. 從磁碟載入數據到記憶體
  2. 在記憶體中修改數據
  3. 把新數據寫到Redo Log Buffer
  4. Redo Log Buffer中數據持久化到Redo Log文件中
  5. Redo Log文件中數據持久化到資料庫磁碟中

你可能會問,為什麼需要寫Redo Log BufferRedo Log FIle?直接持久化到磁碟不好嗎?

直接寫磁碟會有產生嚴重的性能問題:

  1. InnoDB在磁碟中存儲的基本單元是頁,可能本次修改只變更一頁中幾個位元組,但是需要刷新整頁的數據,就很浪費資源。

  2. 一個事務可能修改了多頁中的數據,頁之間又是不連續的,就會產生隨機IO,性能更差。

這種方案叫做WAL(Write-Ahead Logging),預寫日誌,就是先寫日誌,再寫磁碟。

2.3 Redo Log刷盤規則

寫入Redo Log Buffer之後,並不會立即持久化到Redo Log FIle,需要等待操作系統調用fsync()操作,才會刷到磁碟上。

具體什麼時候可以把Redo Log Buffer刷到Redo Log FIle中,可以通過innodb_flush_log_at_trx_commit參數配置決定。

參數值 含義
0(延遲寫) 提交事務後,不會立即刷到OS Buffer中,而是等一秒後刷新到OS Buffer並調用fsync()寫入Redo Log FIle,可能會丟失一秒鐘的數據。
1(實時寫 每次提交事務,都會刷新到OS Buffer並調用fsync()寫到Redo Log FIle,性能較差
2(延遲刷新) 每次提交事務只刷新到OS Buffer,一秒後再調用fsync()寫入Redo Log FIle

InnoDB 的Redo Log File是固定大小的。可以配置為每組4個文件,每個文件的大小是 1GB,那麼Redo Log File可以記錄4GB的操作。

採用迴圈寫入覆蓋的方式,write pos記錄開始寫的位置,向後移動。checkpoint記錄將要擦除的位置,也是向後移動。write pos到checkpoint之間的位置,是可寫區域,checkpoint到write pos之間的位置是已寫區域。

3. Undo Log(回滾日誌)

3.1 Undo Log的內容與作用

Undo Log記錄的是邏輯日誌,也就是SQL語句。

比如:當我們執行一條insert語句時,Undo Log就記錄一條相反的delete語句。

作用:

  1. 回滾事務時,恢復到修改前的數據。

  2. 實現 MVCC(多版本併發控制,Multi-Version Concurrency Control)

MySQL事務中原子性就是使用Undo Log實現的。

3.2 Undo Log如何回滾到上一個版本

實現方式通過兩個隱藏列trx_id(最近一次提交事務的ID)和roll_pointer(上個版本的地址),建立一個版本鏈。併在事務中讀取的時候生成一個ReadView(讀視圖),在Read Committed隔離級別下,每次讀取都會生成一個讀視圖,而在Repeatable Read隔離級別下,只會在第一次讀取時生成一個讀視圖。

4. Bin Log(備份日誌)

4.1 Bin Log的內容與作用

Bin Log記錄的是邏輯日誌,即原始的SQL語句,是MySQL自帶的。

作用: 數據備份和主從同步。

Bin Log共有三種日誌格式,可以binlog_format配置參數指定。

參數值 含義
Statement 記錄原始SQL語句,會導致更新時間與原庫不一致。
比如 update_time=now()
Row 記錄每行數據的變化,保證了數據與原庫一致,缺點是數據量較大。
Mixed Statement和Row的混合模式,預設採用Statement模式,涉及日期、函數相關的時候採用Row模式,既減少了數據量,又保證了數據一致性。

4.2 什麼時候寫入Bin Log?

Bin Log採用追加寫入的模式,並不會覆蓋原有日誌,所以可以用來恢復到之前某個時刻的數據。

Bin Log也是採用WAL模式,先寫日誌,再寫磁碟。

至於什麼時候刷新到磁碟,可以sync_binlog配置參數指定。

參數值 含義
0(延遲寫) 每次提交事務都不會刷盤,由系統自己決定什麼時候刷盤,可能會丟失數據。
1(實時寫) 每次提交事務,都會刷盤,性能較差。
N(延遲寫) 提交N個事務後,才會刷盤。

加入寫Bin Log之後的事務流程:

這就是二階段提交的概念,先寫處於prepare狀態的Redo Log,事務提交後,再寫處於commit狀態的Redo Log。

知識點總結:

有了MySQL日誌的基礎,下篇就可以一塊學習MySQL集群和主從同步了。

文章持續更新,可以微信搜一搜「 一燈架構 」第一時間閱讀更多技術乾貨。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. Text 的絕對居中 Android中顯示時會有預設的padding保留,導致垂直居中會有誤差 //不寫下麵兩個,Android系統上文字會偏下* includeFontPadding: false, textAlignVertical: "center", Text省略號顯示 <Text n ...
  • 2.兩數相加 給你兩個 非空 的鏈表,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式存儲的,並且每個節點只能存儲 一位 數字。 請你將兩個數相加,並以相同形式返回一個表示和的鏈表。 你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。 示例 1: 輸入:l1 = [2,4,3], l2 ...
  • 編寫代碼中通常會有快速初始化數組的需求,例如我們需要一個類似matlab里的zeros函數,假如這裡我們需要生成一個0-23的數組用於表示一天24小時。 最基本的做法如下: function(){ let hours = []; for(let k = 0; k < 24; k++ )hours.p ...
  • 視頻鏈接:P8~P29 黑馬程式員pink老師前端入門教程,零基礎必看的h5(html5)+css3+移動 參考鏈接: HTML 元素 1.HTML語法規範 1.1 基本語法概述 HTML 標簽是由尖括弧包圍的關鍵詞,例如<html>。 HTML 標簽 通常成對出現,例如 開始標簽 和 結束標簽 , ...
  • 設計模式,設計模式概述,UML,UML類圖,七大原則,程式設計七大原則 ...
  • 函數聲明 int plus_one(int n) { return n + 1; } 函數聲明的語法有以下幾點,需要註意。 返回值類型 函數聲明時,首先需要給出返回值的類型,上例是int,表示函數plus_one()返回一個整數。 參數 函數名後面的圓括弧裡面,需要聲明參數的類型和參數名,plus_ ...
  • 數組、排序和查找 數組 數組介紹 數組可以存放多個同一類型的數據。數組也是一種數據類型,是引用類型。即:數組就是一組數據 數組快速入門 //1. double[]表示是double類型的數組,數組名hens //2.{3,5,1,3.4,2,50}表示數組的值/元素,依次表示數組的 //第幾個元素 ...
  • ArrayList分析1-迴圈、擴容、版本 轉載請註明出處 https://www.cnblogs.com/funnyzpc/p/16407733.html 前段時間抽空看了下ArrayList的源碼,發現了一些有意思的東東,真的是大受裨益哈,尤其是版本問題😊 所以,本篇博客開始我將大概分三篇講講 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...