Mysql: Bin log原理以及三種格式

目錄

一、什么是 Binlog?

二、Binlog 的應用場景與案例

1. 數據恢復 (Point-in-Time Recovery)?

2. 主從復制 (Master-Slave Replication)

3. 數據審計

?三、Binlog 的三種格式

1. STATEMENT 模式 (Statement-Based Logging - SBL)

2. ROW 模式 (Row-Based Logging - RBL)

3. MIXED 模式 (Mixed-Based Logging - MBL)


一、什么是 Binlog?

????????Binlog(Binary Log)是 MySQL 數據庫中一種二進制日志文件,它記錄了所有對數據庫的更改操作,包括數據的插入、更新、刪除,以及表結構(DDL)的修改等。Binlog 以事件(event)的形式記錄這些操作,并且是邏輯性的,也就是說它記錄的是SQL語句的邏輯,而不是數據頁的物理變化。

????????它是 MySQL 數據庫服務層提供的,與具體的存儲引擎無關。無論你用的是 InnoDB、MyISAM 還是其他存儲引擎,只要是對數據庫有更改的操作,Server 層都會將它記錄到 Binlog 中。

????????Binlog 的主要目的是為了記錄數據庫發生改變的事件,并且它是一個追加寫入(append-only)的文件,一旦寫入就不會被修改。


二、Binlog 的應用場景與案例

1. 數據恢復 (Point-in-Time Recovery)?

場景: 假設你的電商網站數據庫在今天下午 2 點,因為運維人員誤執行了一條 :

DELETE FROM products;?

導致商品表所有數據丟失。你昨天晚上 12 點對數據庫做了全量備份。

解決方案:

  1. 恢復全量備份: 首先,將昨天晚上 12 點的全量備份恢復到數據庫中,這樣數據就恢復到了昨天晚上 12 點的狀態。

  2. 應用 Binlog: 然后,你需要找到從昨天晚上 12 點備份開始到今天下午 2 點之間(誤刪除之前)的所有 Binlog 文件。使用 mysqlbinlog 工具解析這些 Binlog,并將其中的 SQL 語句應用到恢復后的數據庫上。這樣,數據庫就會從昨天晚上 12 點逐步恢復到今天下午 2 點誤刪除之前的狀態。

案例分析:

????????通過這種方式,即使發生了災難性的數據丟失,只要有定期備份和完整的 Binlog,就可以將數據庫恢復到任意一個精確的時間點,最大限度地減少數據損失。這是 Binlog 在數據安全中最核心的價值之一。


2. 主從復制 (Master-Slave Replication)

場景: 為了提高數據庫的讀取性能和可用性,你希望搭建一個 MySQL 主從復制集群,主庫負責寫入操作,從庫負責讀取操作。這也是Binlog的核心功能,我們來重點講解一下:

什么是 MySQL 主從復制?

????????MySQL 主從復制是一種將數據從一個 MySQL 數據庫服務器(主庫 Master)自動同步到一個或多個其他 MySQL 數據庫服務器(從庫 Slave)的過程。主庫處理所有的寫入操作,而從庫則接收并應用主庫的更新。

這個過程就像是:

  • 主庫 負責記錄所有最新的變化(比如賬本上的每一筆交易)。

  • 從庫 則實時地復制這份賬本,保證自己的數據和主庫保持一致。

Binlog 在 MySQL 主從復制中的實現與底層原理:

????????MySQL 的主從復制是一個異步(或半同步)的數據同步過程,其核心就是通過 Binlog 來實現的。整個過程可以概括為三個主要步驟:寫入 Binlog傳輸 Binlog重放 Binlog

主從復制實現原理圖:

? ? ? ? ? ? ? ?

1. 主庫:寫入 Binlog (Binary Log)

  • 原理: 當主庫執行任何數據修改操作(INSERTUPDATEDELETEDDL 等)時,在事務提交之前,這些操作會被記錄到 Binlog 中。

  • 實現細節:

    • 事件記錄: MySQL 服務器會將這些操作封裝成 Binlog 事件。每個事件都包含了操作的類型、作用的數據庫和表、以及具體的數據變更內容(取決于 Binlog 格式,這個我們之后會提到:SQL 語句或行數據)。

    • 寫入文件: 這些事件會按照順序寫入到當前活躍的 Binlog 文件中。Binlog 文件是追加寫入的,當一個文件達到最大大小時,MySQL 會自動創建一個新的 Binlog 文件。

    • 索引文件: MySQL 還會維護一個 Binlog 索引文件(通常是 .index 后綴),記錄了所有 Binlog 文件的名稱,以便快速查找。

    • 刷盤機制: 為了保證數據安全,Binlog 事件通常會定期或在每次事務提交時被刷寫(fsync)到磁盤上,這由 sync_binlog 參數控制。設置為 1 表示每次事務提交都刷盤,是最安全的,但性能開銷最大。

  • 案例:

    • 你連接到主庫,執行:

      CREATE DATABASE my_shop;
      USE my_shop;
      CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),price DECIMAL(10, 2)
      );
      INSERT INTO products (name, price) VALUES ('Laptop', 1200.00);
      UPDATE products SET price = 1250.00 WHERE id = 1;
      
    • 這些操作會依次被記錄到主庫的 Binlog 文件中(例如 mysql-bin.000001)。如果 Binlog 格式是 ROW,那么 INSERT 會記錄插入的行數據,UPDATE 會記錄更新前后的行數據。

2. 從庫:I/O 線程 (IO Thread) - 傳輸 Binlog

  • 原理: 從庫上有一個專門的 I/O 線程,它負責連接到主庫,并請求主庫發送 Binlog 事件流。

  • 實現細節:

    • 連接主庫: 從庫的 I/O 線程使用在從庫配置中設置的主庫 IP 地址、端口、復制用戶和密碼來連接主庫。

    • 發送請求: 從庫會告訴主庫它已經接收并處理到的 Binlog 文件名和位置(這是通過 CHANGE MASTER TO 命令設定的)。

    • 主庫 Dump 線程: 主庫會為此從庫啟動一個Dump 線程 (Binlog Dump Thread)。這個 Dump 線程會讀取主庫的 Binlog 文件,并將其發送給從庫的 I/O 線程。

    • 寫入 Relay Log: 從庫的 I/O 線程接收到 Binlog 事件后,會將這些事件順序寫入到自己的中繼日志 (Relay Log) 中。中繼日志也是一系列文件,與 Binlog 結構類似。同時,I/O 線程會更新 master.info 文件(或 mysql.slave_master_info 表),記錄當前已接收到的 Binlog 文件名和位置,以便下次斷開重連時可以從上次中斷的地方繼續。

? ? ? ? ? ? ? ? ? ? ? ??

3. 從庫:SQL 線程 (SQL Thread) - 重放 Binlog

  • 原理: 從庫的 SQL 線程負責讀取中繼日志中的事件,并在從庫上逐個執行這些事件,從而使從庫的數據與主庫保持同步。

  • 實現細節:

    • 讀取 Relay Log: SQL 線程會從 Relay Log 中讀取事件。

    • 解析并執行: 對于每個事件,SQL 線程會解析其內容,并將其作為 SQL 語句(或行數據變更)在從庫上執行。

    • 事務處理: 如果主庫的 Binlog 中是一個事務,那么從庫的 SQL 線程也會將這個事務作為一個整體進行提交,確保事務的原子性。

    • 進度記錄: SQL 線程會實時更新 relay-log.info 文件(或 mysql.slave_relay_log_info 表),記錄當前已經執行到的 Relay Log 文件名和位置,以及對應的主庫 Binlog 文件名和位置,這被稱為復制位點

3. 數據審計

場景: 公司的安全規定要求記錄所有對敏感數據的修改歷史,以便在出現問題時進行追溯。

解決方案:

  1. 啟用 Binlog: 確保數據庫啟用了 Binlog。

  2. 解析 Binlog: 定期或實時地使用 mysqlbinlog 工具解析 Binlog 文件。mysqlbinlog 可以將二進制格式的 Binlog 轉換為可讀的 SQL 語句。

  3. 審計分析: 將解析出來的 SQL 語句導入到日志分析系統或專門的審計工具中,進行進一步的分析、過濾和存儲。這樣就可以清晰地看到誰在什么時候對哪個表做了什么操作。

案例分析:

通過解析 Binlog,你可以發現:

  • 非法操作: 哪些用戶執行了非授權的數據修改。

  • 數據變更溯源: 某個字段的值是在何時被誰修改的,修改前后的值是什么。

  • 性能分析: 某些高頻操作對數據庫的性能影響。


?三、Binlog 的三種格式

MySQL 的 Binlog 記錄格式由 binlog_format 參數控制,主要有三種:STATEMENTROWMIXED

1. STATEMENT 模式 (Statement-Based Logging - SBL)
  • 記錄內容: 這種模式記錄的是導致數據改變的 SQL 語句本身。例如,如果你執行 UPDATE users SET age = age + 1 WHERE id = 1;,Binlog 中記錄的就是這條 SQL 語句。

  • 優點:

    • 日志文件小: 只需要記錄執行的 SQL 語句,而不是每條語句影響到的每一行數據的變化,因此 Binlog 文件通常比較小。這在網絡傳輸和存儲方面有優勢。

    • 易于閱讀: 對于人來說,直接查看 SQL 語句更容易理解數據庫在特定時間點做了什么操作。

  • 缺點:

    • 可能導致主從數據不一致: 這是 STATEMENT 模式最大的問題。某些不確定性函數(如 UUID()NOW()RAND())、存儲過程、觸發器等,在主庫和從庫上執行時可能產生不同的結果,從而導致主從數據不一致。

    • 對復雜操作支持不好: 對于像 LOAD DATA INFILE 或包含子查詢的復雜 UPDATE 語句,有時難以準確地在從庫上重放。

案例分析:

假設主庫和從庫的當前時間不同(在復制中這很常見)。

你執行以下 SQL 語句:

INSERT INTO orders (order_time) VALUES (NOW());
  • 主庫: 在主庫上執行時,NOW() 函數會獲取主庫當前時間,比如 2025-07-09 14:30:00。Binlog 記錄的也是 INSERT INTO orders (order_time) VALUES (NOW()); 這條語句。

  • 從庫: 從庫收到這條 Binlog 后,會重放這條 SQL 語句。如果從庫的時間比主庫快或慢,或者因為網絡延遲等原因導致從庫執行時間點和主庫不同,那么從庫上的 NOW() 函數獲取的時間可能與主庫不同(例如 2025-07-09 14:30:05),從而導致主從 order_time 字段的值不一致。

再比如:

DELETE FROM products LIMIT 1;
  • 這條語句沒有 ORDER BY 子句,刪除哪一行是不確定的。

  • 主庫: 可能刪除了 id = 10 的產品。

  • 從庫: 從庫收到語句后重放,可能刪除了 id = 20 的產品,導致主從數據不一致。?

2. ROW 模式 (Row-Based Logging - RBL)
  • 記錄內容: 這種模式記錄的是 行級別的數據變更,包括哪些行被修改了,以及修改前和修改后的行數據。它不記錄具體的 SQL 語句。

  • 優點:

    • 主從數據一致性高: 這是最主要的優點。因為它記錄的是最終的數據變更結果,所以無論 SQL 語句有多復雜或是否包含不確定性函數,從庫都能準確地復制主庫的變更,保證數據一致性。

    • 更安全: 避免了 STATEMENT 模式可能導致的主從不一致問題,尤其適用于復雜的數據庫操作。

    • 可以進行精確恢復: 在數據恢復時,可以精確到行的變更。

  • 缺點:

    • 日志文件可能非常大: 特別是對于 UPDATEDELETE 大量行的操作。例如,一個 UPDATE 語句更新了 100 萬行數據,Binlog 中就會記錄 100 萬行數據的變更,導致 Binlog 文件急劇膨脹,占用大量磁盤空間,并增加網絡傳輸負擔。

    • 不易于閱讀: Binlog 中記錄的是二進制的行數據變化,不直觀,無法直接像 SQL 語句那樣閱讀和理解。

案例分析:

依然是剛才的 INSERT INTO orders (order_time) VALUES (NOW()); 語句。

  • 主庫: 執行 INSERT 后,主庫會將新插入行的所有列的值(包括 order_time 的具體值,例如 2025-07-09 14:30:00)記錄到 Binlog 中。

  • 從庫: 從庫收到 Binlog 后,直接按照 Binlog 中記錄的數據值插入一行,而不會重新計算 NOW()。因此,主從數據庫中的 order_time 字段會完全一致。

再比如:

UPDATE products SET price = price * 1.1 WHERE category = 'electronics';
  • 主庫: 如果有 1000 行 category = 'electronics' 的產品,Binlog 會記錄這 1000 行的 每一行 的變更(舊值和新值)。

  • 從庫: 從庫會根據 Binlog 中記錄的 1000 行的變更信息,直接更新相應的行,而不是再次執行 UPDATE 語句。這樣保證了主從數據的一致性。

3. MIXED 模式 (Mixed-Based Logging - MBL)
  • 記錄內容: MIXED 模式是 STATEMENT 和 ROW 模式的混合體。MySQL 會根據執行的 SQL 語句,自動判斷 應該使用 STATEMENT 模式還是 ROW 模式來記錄 Binlog。

    • 對于那些不會導致主從不一致的 SQL 語句(例如簡單的 SELECTINSERT INTO ... VALUESDELETE FROM ... WHERE id = X),MySQL 會使用 STATEMENT 模式,以保持 Binlog 文件較小。

    • 對于那些可能導致主從不一致的語句(例如包含 NOW()RAND() 的語句,或者沒有 ORDER BYLIMIT 語句等),MySQL 會自動切換到 ROW 模式來記錄。

  • 優點:

    • 兼顧一致性和性能: 在保證數據一致性的前提下,盡量減小 Binlog 文件的大小。這是目前推薦的 Binlog 格式,平衡了兩種模式的優缺點。

    • 智能切換: 由 MySQL 自動判斷,無需 DBA 手動干預。

  • 缺點:

    • 理解復雜性: 對于分析 Binlog 的人來說,Binlog 中可能同時包含 STATEMENT 和 ROW 事件,需要更復雜的解析工具來處理。

案例分析:

  • 執行 INSERT INTO users (name) VALUES ('Alice');:這是一條簡單且確定性的 SQL 語句,MySQL 會以 STATEMENT 模式記錄。

  • 執行 INSERT INTO orders (order_time) VALUES (NOW());:由于 NOW() 函數的不確定性,MySQL 會自動切換到 ROW 模式記錄,確保 order_time 在主從之間完全一致。

  • 執行 DELETE FROM temp_logs LIMIT 100;:如果沒有 ORDER BY 子句,刪除哪些行是不確定的,MySQL 會以 ROW 模式記錄。如果加上 ORDER BY 子句(例如 DELETE FROM temp_logs ORDER BY log_id LIMIT 100;),則可以以 STATEMENT 模式記錄,因為刪除的順序是確定的。

總結:

  • STATEMENT: 最古老的模式,Binlog 文件小,但存在主從不一致的風險。不推薦在新環境中使用。

  • ROW: 最安全、最可靠的模式,確保主從數據一致,但 Binlog 文件可能很大。在對數據一致性要求極高,且不介意 Binlog 文件大小的場景下使用。

  • MIXED: 目前最推薦的模式。它智能地平衡了安全性和效率,既保證了數據一致性,又在可能的情況下減小了 Binlog 文件。

在實際生產環境中,MIXED 模式通常是最佳選擇,因為它在保證數據一致性的同時,能夠有效地管理 Binlog 文件的大小。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88351.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LiteHub之文件下載與視頻播放

文件下載 前端請求 箭頭函數 //這個箭頭函數可以形象理解為,x流入(>)x*x, //自然而然>前面的就是傳入參數,>表示函數體 x > x * x//相當于 function (x) {return x * x; }//如果參數不是一個,就需要用括號()括起來…

QT5使用cmakelists引入Qt5Xlsx庫并使用

1、首先需要已經有了Qt5Xlsx的頭文件和庫,并拷貝到程序exe路徑下(以xxx.exe/3rdparty/qtxlsx路徑為例,Qt5Xlsx版本為0.3.0); 2、cmakelist中: # 設置 QtXlsx 路徑 set(QTXLSX_ROOT_DIR ${CMAKE_CURRENT_SOU…

醋酸鐠:閃亮的稀土寶藏,掀開科技應用新篇章

一、什么是醋酸鐠醋酸鐠是一種鐠的有機鹽,鐠是稀土金屬元素之一。作為一種重要的稀土化合物,醋酸鐠通常以水合物的形式存在,呈現淡黃色或無色結晶。鐠元素本身因其獨特的物理化學特性,在工業和科技領域有著廣泛應用,而…

深入解析JVM內存結構與垃圾回收機制

java是強類型高級語言JVM(Java Virtual Machine,Java虛擬機)是Java平臺的核心組件,它是一個虛擬的計算機,能夠執行Java字節碼(bytecode)。1、區域劃分JVM對Java內存的管理也是分區分塊進行&…

Java 流程控制詳解:從順序執行到跳轉語句,掌握程序邏輯設計

作為一名Java開發工程師,你一定知道,流程控制(Flow Control) 是編寫任何程序的核心。它決定了代碼的執行路徑、分支走向和循環次數。本文將帶你系統梳理 Java中的所有常用流程控制結構,包括:順序結構分支結…

面試150 環形鏈表

思路 采用雙指針法,slow指針每次走一步,fast指針每次走兩步,如果相遇的情況下,slow指針回到開始的位置,此時快慢指針各走一步,當相遇的時候也就是說明鏈表中有環。 # Definition for singly-linked list. # class ListNode: # def __init…

AI技術正在深度重構全球產業格局,其影響已超越工具屬性,演變為推動行業變革的核心引擎。

一、AI如何重塑AI的工作與行業(AI助手領域)能力升級理解與生成:基于LLM(大語言模型),AI能處理開放式問題、撰寫報告、翻譯代碼,替代部分人類知識工作。個性化交互:通過用戶歷史對話分…

Kafka的無消息丟失配置怎么實現

那 Kafka 到底在什么情況下才能保證消息不丟失呢? Kafka 只對“已提交”的消息(committed message)做有限度的持久化保證。 第一個核心要素是“已提交的消息”。什么是已提交的消息?當 Kafka 的若干個 Broker 成 功地接收到一條…

集成CommitLInt+ESLint+Prettier+StyleLint+LintStaged

代碼可讀性低代碼 代碼規范落地難代碼格式難統一代碼質量低下 配置 ESLint ESLint 是一個用來識別 ECMAScript 并且按照規則給出報告的代碼檢測工具,使用它可以避免低級錯誤和統一代碼的風格。它擁有以下功能: 查出 JavaScript 代碼語法問題。根據配置…

尋找兩個正序數組的中位數(C++)

給定兩個大小分別為 m 和 n 的正序(從小到大)數組 nums1 和 nums2。請你找出并返回這兩個正序數組的 中位數 。算法的時間復雜度應該為 O(log (mn)) 。示例 1:輸入:nums1 [1,3], nums2 [2] 輸出:2.00000 解釋&#x…

Expected Sarsa 算法的數學原理

🌟 一、Expected Sarsa 算法的數學原理 1. 什么是 Expected Sarsa? Expected Sarsa 是一種基于 時序差分(Temporal Difference, TD)學習 的強化學習算法,用于估計 動作值函數 ( q_{\pi}(s, a) )。它是 Sarsa 算法的一種…

Vue的watch和React的useEffect

參考文章:https://zhuanlan.zhihu.com/p/686329898

idea中合并git分支

1.把本地dev代碼合并到本地master代碼在提交代碼之前,先確保dev和master都拉取了最新的代碼都進行了Git->pull了這時候確保Local的第一個分支是master分支,然后選擇dev分支 ,鼠標右鍵-》Merge dev into master這時候會提示 有合并到本地master最新的代…

《Spring 中上下文傳遞的那些事兒》Part 7:異步任務上下文丟失問題詳解

📝 Part 7:異步任務上下文丟失問題詳解 在現代 Java 應用中,異步編程已經成為提升性能、解耦業務邏輯的重要手段。無論是使用 CompletableFuture、線程池(ExecutorService)、定時任務(ScheduledExecutorSe…

大語言模型驅動智能語音應答:技術演進與架構革新

在智能客服、電話銀行等場景中,用戶時常遇到這樣的困境:“請描述您的問題...抱歉沒聽清,請重試...正在為您轉接人工”。傳統語音應答(IVR)系統受限于規則引擎與淺層語義理解,難以應對復雜多變的自然語言表達…

【Linux】內存管理

要求:1、編寫程序,實現如下功能。(1)隨機生成 1000000 個 0~1 之間的數;(2)統計分析這些數據,計算均值、方差和分布情況,分布情況按0.01 的步長進行統計;&…

蒼穹外賣—day1

文章目錄前言一、接口文檔導入與生成二、前端環境搭建三、后端環境搭建1. 了解項目結構2. 環境搭建常見問題總結前言 (簡要說明筆記的目的:記錄搭建過程、關鍵配置和結構理解) 一、接口文檔導入與生成 Apifox 導入 使用工具:https…

基于微信小程序的在線疫苗預約小程序源碼+論文

基于微信小程序的在線疫苗預約系統源碼論文代碼可以查看文章末尾??聯系方式獲取,記得注明來意哦~🌹 分享萬套開題報告任務書答辯PPT模板 作者完整代碼目錄供你選擇: 《SpringBoot網站項目》800套 《SSM網站項目》1200套 《小程序項目》600套…

Windows 11 安裝過程中跳過微軟賬戶創建本地賬戶

背景 在 Windows 11 的安裝和設置過程中,Microsoft 賬號登錄是默認的認證方式。然而,在某些情況下,可能需要繞過此步驟以創建本地賬戶。 微軟在 2025 年 3 月推送的 Windows 11 預覽版(Build 26120.3653 和 Build 26200.5516&am…

利用DBeaver實現異構數據庫數據定時任務同步

1、背景 本需求需要實現抽取KingBaseEs數據庫的某幾張表數據,定時同步到MySQL中 2、工具準備 2.1 DBeaverEE25.1(必須要企業版,如果用社區版沒有定時任務功能) https://dbeaver.io/download/ 2.2 KingBaseEs數據庫及驅動 https://www.kingbase.com…