最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL三大日志之redo?log、undo?log、binlog示例詳解

 更新時間:2025年09月18日 11:23:31   作者:c-der  
在MySQL數(shù)據(jù)庫的運行機制中,Redo Log、Undo Log和Binlog起著至關重要的作用,它們各司其職,共同保障數(shù)據(jù)庫的數(shù)據(jù)安全、事務一致性以及高效的復制與恢復功能,這篇文章主要介紹了MySQL三大日志之redo?log、undo?log、binlog的相關資料,需要的朋友可以參考下

前言

在 MySQL 數(shù)據(jù)庫中,日志系統(tǒng)是保障數(shù)據(jù)一致性、支持事務和故障恢復的核心組件。其中,redo log(重做日志)、undo log(回滾日志)和 binlog(二進制日志)被稱為"三大日志",它們分工協(xié)作,共同維護著數(shù)據(jù)庫的可靠性和可用性。本文將深入解析這三種日志的工作原理、應用場景及它們之間的協(xié)同機制。

1. redo log(重做日志):保障數(shù)據(jù)持久性

1.1 什么是 redo log?

redo log 是 InnoDB 存儲引擎特有的物理日志,用于記錄數(shù)據(jù)頁的物理修改操作。它的核心作用是保證事務的持久性(ACID 中的 D),防止 MySQL 意外崩潰后丟失已提交的數(shù)據(jù)。

1.2 工作原理:Write-Ahead Logging (WAL)

redo log 采用了預寫日志機制,即當事務執(zhí)行數(shù)據(jù)修改時:

  1. 先將修改操作記錄到內存中的 redo log buffer
  2. 再異步或同步地將 redo log 寫入磁盤
  3. 最后在合適的時機將內存中的數(shù)據(jù)頁(Buffer Pool)刷寫到磁盤

這種機制確保了即使數(shù)據(jù)還未寫入磁盤,只要 redo log 已持久化,MySQL 重啟后就能通過 redo log 恢復這些修改,從而保證已提交事務的數(shù)據(jù)不會丟失。

1.3 關鍵特性

  • 循環(huán)寫機制:redo log 文件大小固定,寫滿后會覆蓋舊的日志記錄(已刷盤的數(shù)據(jù)對應的日志可被覆蓋)
  • 物理日志:記錄的是"某數(shù)據(jù)頁的某個位置做了什么修改",例如"表空間 X 中頁 Y 的偏移量 Z 寫入了值 A"
  • 高性能:順序寫入磁盤,避免了隨機 I/O 的性能開銷

1.4 刷盤策略配置

redo log 的刷盤策略由 innodb_flush_log_at_trx_commit 參數(shù)控制,有三種取值:

-- 查看當前配置
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
  • 1(默認值,最安全):事務提交時,立即將 redo log 從內存寫入磁盤并等待完成。即使 MySQL 或服務器崩潰,已提交的事務也不會丟失,但性能開銷較大。

  • 0(性能優(yōu)先):事務提交時,僅將 redo log 寫入內存的 log buffer,不立即刷盤。每隔 1 秒由后臺線程批量刷盤??赡軄G失最近 1 秒內的已提交事務。

  • 2(平衡策略):事務提交時,將 redo log 寫入操作系統(tǒng)緩存(OS cache),但不立即刷到物理磁盤。操作系統(tǒng)會定期刷盤。比 0 更安全(僅在 OS 崩潰時可能丟失數(shù)據(jù))。

2. undo log(回滾日志):保障事務原子性

2.1 什么是 undo log?

undo log 是 InnoDB 存儲引擎的邏輯日志,用于記錄事務修改前的數(shù)據(jù)狀態(tài)。它的核心作用是保障事務的原子性(ACID 中的 A),支持事務回滾操作,同時也是實現(xiàn) MVCC(多版本并發(fā)控制)的基礎。

2.2 工作原理

當事務執(zhí)行修改操作時:

  1. InnoDB 會先記錄數(shù)據(jù)修改前的狀態(tài)到 undo log
  2. 如果事務執(zhí)行失敗或調用 ROLLBACK,InnoDB 會利用 undo log 還原數(shù)據(jù)到修改前的狀態(tài)
  3. 在 MVCC 機制中,其他事務可以通過 undo log 訪問數(shù)據(jù)的歷史版本,實現(xiàn)"讀不加鎖"

例如,當執(zhí)行 UPDATE t SET name = 'B' WHERE id = 1 時,undo log 會記錄"將 id=1 的 name 改回 ‘A’"(假設原來的值是 ‘A’)。

2.3 關鍵特性

  • 邏輯日志:記錄的是操作的逆過程(邏輯指令),而非物理地址
  • 多版本支持:每個事務看到的數(shù)據(jù)版本由 undo log 維護
  • 可回收性:事務提交后,undo log 不會立即刪除,而是被標記為可回收,由后臺 purge 線程定期清理

2.4 存儲與刷盤

undo log 存儲在 InnoDB 的 undo 表空間中,本質上是一種特殊的數(shù)據(jù)頁。它的刷盤策略與普通數(shù)據(jù)頁一致:

  • 先寫入內存中的 Buffer Pool
  • 通過 Checkpoint 機制異步批量刷盤
  • 其自身的持久性由 redo log 保障(undo log 的修改會被記錄到 redo log 中)

3. binlog(二進制日志):支持復制與恢復

3.1 什么是 binlog?

binlog 是 MySQL 服務器層的邏輯日志,記錄了所有 DDL(數(shù)據(jù)定義語言)和 DML(數(shù)據(jù)操縱語言)操作。它不依賴于特定的存儲引擎,所有引擎都可以使用。

3.2 主要作用

  • 主從復制:主庫的 binlog 發(fā)送到從庫,從庫重放日志以保持數(shù)據(jù)同步
  • 時間點恢復(PITR):結合全量備份,通過重放 binlog 可以將數(shù)據(jù)庫恢復到指定時間點
  • 審計:記錄所有數(shù)據(jù)修改操作,便于追溯

3.3 工作原理

當執(zhí)行數(shù)據(jù)修改操作時:

  1. 操作會被記錄到 binlog 緩存中
  2. 事務提交時,binlog 會被寫入磁盤
  3. binlog 以事件形式記錄,包含操作類型、數(shù)據(jù)變更、時間戳等信息

3.4 日志格式

binlog 有三種格式,通過 binlog_format 參數(shù)配置:

-- 查看當前格式
SHOW VARIABLES LIKE 'binlog_format';
  • STATEMENT:記錄執(zhí)行的 SQL 語句。日志體積小,但可能存在主從數(shù)據(jù)不一致的風險(如使用 NOW()、RAND() 等函數(shù))。

  • ROW:記錄數(shù)據(jù)行的修改細節(jié)(如"將 id=1 的 name 從 ‘A’ 改為 ‘B’")。主從一致性最好,但日志體積較大。

  • MIXED:默認使用 STATEMENT 格式,特殊場景自動切換為 ROW 格式,平衡了日志體積和一致性。

3.5 刷盤策略

binlog 的刷盤策略由 sync_binlog 參數(shù)控制:

-- 查看當前配置
SHOW VARIABLES LIKE 'sync_binlog';
  • 1(最安全):每次事務提交時,立即將 binlog 從內存緩存刷到物理磁盤。保證 binlog 不丟失,但性能開銷大。

  • 0(性能優(yōu)先):事務提交時,僅將 binlog 寫入操作系統(tǒng)緩存(OS cache),不立即刷盤。由操作系統(tǒng)決定何時刷盤,可能丟失未刷盤的 binlog。

  • N(N>1,平衡策略):每累積 N 個事務提交后,觸發(fā)一次 binlog 刷盤。減少刷盤次數(shù),最多可能丟失 N-1 個事務的 binlog。

4. 三大日志的協(xié)同工作機制

在一個完整的事務處理過程中,三種日志會協(xié)同工作,確保數(shù)據(jù)的一致性和可靠性:

  1. 事務開始:InnoDB 為事務分配事務 ID
  2. 執(zhí)行修改
    • 記錄數(shù)據(jù)修改前的狀態(tài)到 undo log
    • 修改內存中的數(shù)據(jù)頁(Buffer Pool)
    • 記錄數(shù)據(jù)頁的修改到 redo log buffer
  3. 事務提交
    • 執(zhí)行兩階段提交(2PC):
      a. 階段一:將 redo log 標記為"prepare"狀態(tài)并刷盤
      b. 階段二:寫入 binlog 并刷盤
      c. 階段三:將 redo log 標記為"commit"狀態(tài)并刷盤
    • 釋放鎖資源
  4. 后臺操作
    • 定期將 Buffer Pool 中的數(shù)據(jù)頁刷寫到磁盤
    • 事務提交后,undo log 被標記為可回收,等待 purge 線程清理

這種協(xié)同機制確保了:

  • 即使 MySQL 崩潰,redo log 保證已提交事務的數(shù)據(jù)不丟失
  • 若事務失敗,undo log 保證可以回滾到修改前的狀態(tài)
  • binlog 保證了主從復制的數(shù)據(jù)一致性和時間點恢復能力

5. 三大日志的核心區(qū)別

特性redo logundo logbinlog
所屬層級InnoDB 存儲引擎層InnoDB 存儲引擎層MySQL 服務器層
主要作用保證事務持久性(崩潰恢復)保證事務原子性(回滾)+ MVCC主從復制 + 時間點恢復
日志類型物理日志(數(shù)據(jù)頁修改)邏輯日志(操作逆過程)邏輯日志(SQL 或行修改)
生命周期循環(huán)寫(可覆蓋)事務提交后可回收追加寫(不覆蓋)
刷盤時機事務執(zhí)行中實時寫入,提交時確保持久化隨數(shù)據(jù)頁異步刷盤事務提交時寫入
存儲引擎依賴僅 InnoDB 支持僅 InnoDB 支持所有引擎都支持

6. 總結

MySQL 的三大日志各有側重又協(xié)同工作,共同構建了數(shù)據(jù)庫的事務安全和可靠性體系:

  • redo log 確保了已提交事務的數(shù)據(jù)不會因崩潰而丟失,是數(shù)據(jù)庫"crash-safe"的基礎
  • undo log 提供了事務回滾能力,并支撐了 MVCC 機制,實現(xiàn)了高并發(fā)下的讀一致性
  • binlog 則是主從復制和時間點恢復的核心,支撐了 MySQL 的分布式架構

理解這三種日志的工作原理和協(xié)同機制,對于數(shù)據(jù)庫性能優(yōu)化、故障排查和架構設計都具有重要意義。在實際應用中,應根據(jù)業(yè)務需求合理配置日志參數(shù),在數(shù)據(jù)安全性和性能之間找到最佳平衡點。

到此這篇關于MySQL三大日志之redo log、undo log、binlog的文章就介紹到這了,更多相關MySQL日志redo log、undo log、binlog內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL中group_concat函數(shù)用法小結

    MySQL中group_concat函數(shù)用法小結

    MySQL中group_concat函數(shù)用于將groupby產生的同一個分組中的值連接成一個字符串,支持去重、排序和自定義分隔符,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • 一文讀懂MySQL?表分區(qū)

    一文讀懂MySQL?表分區(qū)

    MySQL自帶了分區(qū)功能,我們可以創(chuàng)建一個帶有分區(qū)的表,而且不需要借助任何外部工具,本文主要了介紹了MySQL表分區(qū),具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>
    2022-03-03
  • MySQL的兩種分頁方式之Offset/Limit分頁和游標分頁詳解

    MySQL的兩種分頁方式之Offset/Limit分頁和游標分頁詳解

    這篇文章主要對比了MySQL的Offset/Limit分頁與游標分頁,指出前者簡單但存在數(shù)據(jù)漂移和性能缺陷,后者通過游標避免這些問題且更高效,建議根據(jù)業(yè)務場景選擇分頁方式,深度分頁或動態(tài)數(shù)據(jù)宜用游標分頁,而延遲聯(lián)結可優(yōu)化Offset/Limit性能,需要的朋友可以參考下
    2025-09-09
  • 詳解MySQL安裝及MySQL8.0新密碼認證方式

    詳解MySQL安裝及MySQL8.0新密碼認證方式

    這篇文章主要介紹了詳解MySQL安裝及MySQL8.0新密碼認證方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • MySQL實現(xiàn)字段或字符串拼接的三種方式總結

    MySQL實現(xiàn)字段或字符串拼接的三種方式總結

    這篇文章主要為大家詳細介紹了MySQL中實現(xiàn)字段或字符串拼接的三種方式,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-01-01
  • mysql啟動時出現(xiàn)ERROR 2003 (HY000)問題的解決方法

    mysql啟動時出現(xiàn)ERROR 2003 (HY000)問題的解決方法

    這篇文章主要為大家詳細介紹了mysql啟動時出現(xiàn)ERROR 2003 (HY000問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • MySQL內存使用率高問題排查過程以及解決方案

    MySQL內存使用率高問題排查過程以及解決方案

    在生產環(huán)境中MySQL作為一個關鍵的數(shù)據(jù)庫組件,其性能對整個系統(tǒng)的穩(wěn)定性至關重要,這篇文章主要介紹了MySQL內存使用率高問題排查過程以及解決方案的相關資料,需要的朋友可以參考下
    2025-07-07
  • Linux下MySQL安裝配置 MySQL配置參數(shù)詳解

    Linux下MySQL安裝配置 MySQL配置參數(shù)詳解

    Linux下MySQL安裝配置 MySQL配置參數(shù)詳解,在linux下配置mysql的朋友可以參考下。
    2011-07-07
  • MySQL安全設置圖文教程

    MySQL安全設置圖文教程

    MySQL安全設置,跟mssql差不多都是以普通用戶權限運行mysql。其它的也需要注意下。
    2011-01-01
  • Mysql賬號管理與引擎相關功能實現(xiàn)流程

    Mysql賬號管理與引擎相關功能實現(xiàn)流程

    Mysql中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平、并且最終提供廣泛的不同功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善應用的整體功能。這些不同的技術以及配套的相關功能在MySQL中被稱作存儲引擎
    2022-10-10

最新評論

威远县| 阿拉善右旗| 北宁市| 方正县| 邹城市| 体育| 阳曲县| 嵊泗县| 新丰县| 凯里市| 洛隆县| 峨眉山市| 葵青区| 秀山| 丹棱县| 株洲市| 方城县| 宣城市| 万安县| 崇礼县| 达尔| 陆良县| 登封市| 乡宁县| 金沙县| 阜阳市| 新平| 乌鲁木齐县| 郎溪县| 永登县| 莱西市| 昌江| 望城县| 陵水| 罗江县| 北票市| 册亨县| 延边| 望江县| 凤翔县| 桦川县|