【MYSQL】如何解決 bin log 與 redo log 的一致性問題

該問題問的其實就是redo log 的兩階段提交

為什么說redo log 具有崩潰恢復的能力

MySQL Server 層擁有的 bin log 只能用于歸檔,不足以實現崩潰恢復(crash-safe),需要借助 InnoDB 引擎的 redo log 才能擁有崩潰恢復的能力。所謂崩潰恢復就是:即使在數據庫宕機的情況下,也不會出現操作一半的情況

至于為什么說 redo log 具有崩潰恢復的能力,而 bin log 沒有,我們先來簡單看一下這兩種日志有哪些不同點:

1)適用對象不同:

bin log 是 MySQL 的 Server 層實現的,所有引擎都可以使用
而 redo log 是 InnoDB 引擎特有的

2)寫入內容不同:

bin log 是邏輯日志,記錄的是這個語句的原始邏輯,比如 “給 id = 1 這一行的 age 字段加 1”
redo log 是物理日志,記錄的是 “在某個數據頁上做了什么修改”

3)寫入方式不同:

bin log 是可以追加寫入的。“追加寫” 是指 bin log 文件寫到一定大小后會切換到下一個,并不會覆蓋以前的日志
redo log 是循環寫的,空間固定會被用完
可以看到,redo log 和 bin log 的一個很大的區別就是,一個是循環寫,一個是追加寫。也就是說 redo log 只會記錄未刷入磁盤的日志,已經刷入磁盤的數據都會從 redo log 這個有限大小的日志文件里刪除。

而 bin log 是追加日志,保存的是全量的日志。這就會導致一個問題,那就是沒有標志能讓 InnoDB 從 bin log 中判斷哪些數據已經刷入磁盤了,哪些數據還沒有。

舉個例子,bin log 記錄了兩條日志:

記錄 1:給 id = 1 這一行的 age 字段加 1
記錄 2:給 id = 1 這一行的 age 字段加 1

假設在記錄 1 刷盤后,記錄 2 未刷盤時,數據庫崩潰。重啟后,只通過 bin log 數據庫是無法判斷這兩條記錄哪條已經寫入磁盤,哪條沒有寫入磁盤,不管是兩條都恢復至內存,還是都不恢復,對 id = 1 這行數據來說,都是不對的。

但 redo log 不一樣,只要刷入磁盤的數據,都會從 redo log 中被抹掉,數據庫重啟后,直接把 redo log 中的數據都恢復至內存就可以了。

這就是為什么說 redo log 具有崩潰恢復的能力,而 bin log 不具備。

redo log 兩階段提交

查詢語句

前面我們介紹過一條 SQL 查詢語句的執行過程,簡單回顧:

1、MySQL 客戶端與服務器間建立連接,客戶端發送一條查詢給服務器;

2、服務器先檢查查詢緩存,如果命中了緩存,則立刻返回存儲在緩存中的結果;否則進入下一階段;

3、服務器端進行 SQL 解析、預處理,生成合法的解析樹;

4、再由優化器生成對應的執行計劃;

5、執行器根據優化器生成的執行計劃,調用相應的存儲引擎的 API 來執行,并將執行結果返回給客戶端

在這里插入圖片描述

更新語句

對于更新語句來說,這套流程同樣也是要走一遍的,不同的是,更新流程還涉及兩個重要的日志模塊 bin log 和 redo log。

以下面這條簡單的 SQL 語句為例,我們來解釋下執行器和 InnoDB 存儲引擎在更新時做了哪些事情:

update table set age = age + 1 where id = 1;

1、執行器:找存儲引擎取到 id = 1 這一行記錄

2、存儲引擎:根據主鍵索引樹找到這一行,如果 id = 1 這一行所在的數據頁本來就在內存池(Buffer Pool)中,就直接返回給執行器;否則,需要先從磁盤讀入內存池,然后再返回

3、執行器:拿到存儲引擎返回的行記錄,把 age 字段加上 1,得到一行新的記錄,然后再調用存儲引擎的接口寫入這行新記錄

4、存儲引擎:將這行新數據更新到內存中,同時將這個更新操作記錄到 redo log 里面,此時 redo log 處于 prepare 狀態。然后告知執行器執行完成了,隨時可以提交事務

5、執行器:生成這個操作的 bin log,并把 bin log 寫入磁盤

6、執行器:調用存儲引擎的提交事務接口

7、存儲引擎:把剛剛寫入的 redo log 狀態改成提交(commit)狀態,更新完成

在這里插入圖片描述
可以看到,所謂兩階段提交,其實就是把 redo log 的寫入拆分成了兩個步驟:prepare 和 commit。

所以,為什么要這樣設計呢?這樣設計怎么就能夠實現崩潰恢復呢?

根據兩階段提交,崩潰恢復時的判斷規則是這樣的:
1、如果 redo log 里面的事務是完整的,也就是已經有了 commit 標識,則直接提交
2、如果 redo log 里面的事務處于 prepare 狀態,則判斷對應的事務 binlog 是否存在并完整
a. 如果 binlog 存在并完整,則提交事務;
b. 否則,回滾事務。

注: MySQL 咋知道 bin log 是不是完整的?
簡單來說,一個事務的 binlog 是有完整格式的:
1、statement格式的 bin log,最后會有 COMMIT
2、row 格式的 bin log,最后會有 XID event

實際的例子

1、假設數據庫在寫入 redo log(prepare) 階段之后、寫入 binlog 之前,發生了崩潰,此時 redo log 里面的事務處于 prepare 狀態,binlog 還沒寫,所以崩潰的時候,這個事務會回滾。

由于 binlog 還沒寫,所以也就不會傳到備庫,從而避免主備不一致的情況

在這里插入圖片描述

2、如果數據庫在寫入 binlog 之后,redo log 狀態修改為 commit 前發生崩潰,此時 redo log 里面的事務仍然是 prepare 狀態,binlog 存在并完整,所以即使在這個時刻數據庫崩潰了,事務仍然會被正常提交。

因為 binlog 已經寫入成功了,這樣之后就會被從庫同步過去,但是實際上主庫并沒有完成這個操作,所以為了主備一致,在主庫上需要提交這個事務。

在這里插入圖片描述
其實可以看出來,處于 prepare 階段的 redo log 加上完整的 bin log,就能保證數據庫的崩潰恢復了。

如果數據庫在寫入 binlog 之前,此時 redo log 里面的事務是 prepare 狀態,binlog 存在但不完整,在這個時刻數據庫崩潰了,事務就會被回滾。

redo log兩階段提交的重要性(可不可以先 redo log 寫完,再寫 bin log 或者反過來?)

1)對于先寫完 redo log 后寫 bin log 的情況:

假設在 redo log 寫完,bin log 還沒有寫完的時候,MySQL 崩潰。主庫中的數據確實已經被修改了,但是這時候 bin log 里面并沒有記錄這個語句。因此,從庫同步的時候,就會丟失這個更新,和主庫不一致。

在這里插入圖片描述

2)對于先寫完 binlog 后寫 redo log 的情況
如果在 bin log 寫完,redo log 還沒寫的時候,MySQL 崩潰。因為 binlog 已經寫入成功了,這樣之后就會被從庫同步過去,但是實際上 redo log 還沒寫,主庫并沒有完成這個操作,所以從庫相比主庫就會多執行一個事務,導致主備不一致

在這里插入圖片描述

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

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

相關文章

PHP的發展歷程以及功能使用場景

PHP的發展歷程 PHP的發展歷程可以追溯到1994年,由丹麥計算機程序員拉斯穆斯勒多夫(Rasmus Lerdorf)出于個人網站統計訪問者信息的需求而創建。以下是PHP發展歷程中的幾個重要里程碑: 初創階段(1994-1995年&#xff09…

二刷力扣——單調棧

739. 每日溫度 單調棧應該從棧底到棧頂 是遞減的。 找下一個更大的 ,用遞減單調棧,就可以確定在棧里面的每個比當前元素i小的元素,下一個更大的就是這個i,然后彈出并記錄;然后當前元素i入棧,仍然滿足遞減…

數學基礎 -- 三角學

三角學 三角學(Trigonometry)是數學的一個分支,主要研究三角形的邊長與角度之間的關系。三角學在幾何學、物理學、工程學等多個領域中有廣泛的應用。以下是三角學的一些基本概念和公式: 基本概念 直角三角形:一個角…

Java進階----繼承

繼承 一.繼承概述 繼承是可以通過定義新的類,在已有類的基礎上擴展屬性和功能的一種技術. 案例:優化 貓、狗JavaBean類的設計 狗類:Dog 屬性:名字 name,年齡 age 方法:看家 watchHome(),Gett…

防抖和字節流

防抖(Debouncing)和字節流(Byte Stream)是兩個不同的概念,分別在編程和數據傳輸領域中使用。 防抖(Debouncing) 防抖是一種在前端開發中常用的技術,用于控制事件處理函數的執行頻率…

Android多開應用軟件系統設計

設計一個支持Android多開應用的軟件系統,主要涉及到以下幾個關鍵技術點和設計考慮: 1. 虛擬化技術 容器技術:與傳統的虛擬機不同,可以采用更輕量級的容器技術,為每個應用實例創建獨立的運行環境。這包括分配獨立的用…

Ubuntu配置sendmail client,用sendmail命令來發送郵件

參考文檔 https://mailoutgoing.com/support/mailrelay/sendmail.html https://www.sendmail.org/~ca/email/auth.html https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/configure-sendmail.html 總結 1、ubuntu環境下,sendmail服務位于/etc/i…

HTTP 請求走私漏洞詳解

超詳細的HTTP請求走私漏洞教程,看完還不會你來找我。 1. 簡介 HTTP請求走私漏洞(HTTP Request Smuggling)發生在前端服務器(也稱代理服務器,一般會進行身份驗證或訪問控制)和后端服務器在解析HTTP請求時&…

上位機圖像處理和嵌入式模塊部署(mcu項目2:串口日志記錄器)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】 淘寶上面有一個商品蠻好玩的,那就是日志記錄器。說是記錄器,其實就是一個模塊,這個模塊的輸入是一個ttl串口&am…

利用Python進行數據分析PDF下載經典數據分享推薦

本書由Python pandas項目創始人Wes McKinney親筆撰寫,詳細介紹利用Python進行操作、處理、清洗和規整數據等方面的具體細節和基本要點。第2版針對Python 3.6進行全面修訂和更新,涵蓋新版的pandas、NumPy、IPython和Jupyter,并增加大量實際案例…

Docker Desktop如何換鏡像源?

docker現在很多鏡像源都出現了問題,導致無法拉取鏡像,所以找到一個好的鏡像源,尤為重要。 一、阿里鏡像源 經過測試,目前,阿里云鏡像加速地址還可以使用。如果沒有阿里云賬號,需要先注冊一個賬號。 地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 二…

基于Java技術的B/S模式書籍學習平臺

你好,我是專注于計算機科學領域的學姐碼農小野。如果你對書籍學習平臺開發感興趣或有相關需求,歡迎私信聯系我。 開發語言: Java 數據庫: MySQL 技術: B/S模式、Java技術 工具: Eclipse、Navicat、Mave…

【Go】函數的使用

目錄 函數返回多個值 init函數和import init函數 main函數 函數的參數 值傳遞 引用傳遞(指針) 函數返回多個值 用法如下: package mainimport ("fmt""strconv" )// 返回多個返回值,無參數名 func Mu…

相鄰不同數字的標記

鏈接:登錄—專業IT筆試面試備考平臺_牛客網 來源:牛客網 時間限制:C/C 1秒,其他語言2秒 空間限制:C/C 262144K,其他語言524288K 64bit IO Format: %lld 題目描述 小紅拿到了一個數組,每個數…

ctfshow web入門 nodejs web334--web337

web334 有個文件下載之后改后綴為zip加壓就可以得到兩個文件 一個文件類似于index.php 還有一個就是登錄密碼登錄成功就有flag username:ctfshow password:123456因為 return name!CTFSHOW && item.username name.toUpperCase() && item.password passwor…

SpringBoot的熱部署和日志體系

SpringBoot的熱部署 每次修改完代碼,想看效果的話,不用每次都重新啟動代碼,等待項目重啟 這樣就可以了 JDK官方提出的日志框架:Jul log4j的使用方式: (1)引入maven依賴 (2&#x…

軟件開發語言都有哪些?

構建高效、穩定且安全的服務器應用,開發者們需要選擇合適的編程語言。以下是幾種流行的網絡服務器開發語言,每種語言都有其獨特的特性和適用場景。 Java Java是一種廣泛使用的高級編程語言,以其“一次編寫,到處運行”的理念而著稱…

光譜優化算法(Lightning Search Optimization, LSO)及其Python和MATLAB實現

光譜優化算法(Lightning Search Optimization, LSO)是一種基于自然界雷暴現象啟發的新型優化算法,旨在尋找最優解或近似最優解的問題。LSO算法不僅可以用于連續優化問題,還能用于離散優化問題。接下來將詳細介紹LSO算法的背景、原…

內鏡像源-大全

1、pip安裝鏡像 阿里鏡像 https://developer.aliyun.com/mirror/ 清華大學開源軟件鏡像 https://mirrors.tuna.tsinghua.edu.cn/ 浙大鏡像源 http://mirrors.zju.edu.cn/ 網易鏡像源 https://mirrors.163.com/ sohu鏡像源 https://mirrors.sohu.com/ 中科大鏡像 https://mirr…

OS Copilot測評-CSDN

登錄控制臺 安裝插件 sudo yum install -y os-copilot效果如下 配置 AccessKey ID 與 AccessKey Secret 注意安全,使用完成后,別忘了去控制臺刪除,一般情況使用子Key就可以 檢測是否可用 co hi實際操作(當前為官方案例請求) 實操1&…