基于Redo log Undo log的MySQL的崩潰恢復

基于Redo log & Undo log的MySQL的崩潰恢復

Redo log Undo log

Redo log 重做日志,記錄,修改過的數據
Undo log 回滾日志,記錄修改之前的數據

兩個我不做詳細的介紹了,redo log就是記錄哪些地方被修改了
undo log是記錄修改之前我們的數據長什么樣

更新流程

在這里插入圖片描述

我們來捋一下這個流程,首先是更新數據,會先去Buffer Pool中查找是否有這個頁,如果說不存在這個頁,就會從磁盤中加載,也就是第二步

第三步,有了這個頁,我們需要先寫Undo log,在一切開始之前,先記錄沒動過的樣子

第四步,就是更新數據,先是寫入Redo log Buffer中,因為一個事務中不止一個修改的地方,所以先寫道Redo log Buffer中,一并寫入到Redo log 文件中去

然后是寫Binlog文件

其中有幾點我們需要繼續探討

為什么要寫入Redo log buffer中?我們修改完頁,為什么不直接刷入到磁盤中去

這個問題很好理解,為什么修改之后,不直接刷入到磁盤去呢?因為這樣子做,效率太低了,我們要刷入到磁盤的化,肯定是以頁為單位的,一個頁是16kb,而且還是隨機IO,那樣寫的太慢了,我么redo log 文件,是順序IO,性能快,而且不是完整的頁

占用內存小,又快,肯定寫到buffer中去,然后寫到redo log file文件中啊

兩階段提交

binlog的一致性問題出現

你可能聽過兩階段提交,就是為了解決binlog的一致性問題的

我們來想想,怎么會出現這個問題

刷盤的目的,無非就是兩個目的,redo log寫到磁盤中去,binlog寫到磁盤中去

那無非就有兩種方案
第一,先寫redo log ,再寫binlog
第二,先寫bin log,再寫redo log

第一種方案:
先寫了redo log,bin log 還沒寫,MySQL宕機,redo log刷入了磁盤,bin log沒有這條記錄,此時bin log就丟失了記錄,出現一致性問題

第二種方案:
先寫bin log,redo log還沒寫,MySQL宕機,此時redo log沒寫,那么重啟的時候,binlog 和redo log又不一樣實際的數據又會丟失

所以我們必須保證一個事情,binlog 和 Redo log 必須保持一致性!!

為了這個目標就有兩階段提交,也就是2PC(two-phase commit protocool)

基于2PC

在這里插入圖片描述
為了保證事務的一致性,所以就出現了2PC,它將事務的提交分成了兩個不部分Prepare和Commit/Rollback

在這里插入圖片描述

Prepare階段,首先我們從Redo log Buffer種將Redo Log寫入文件,然后刷入磁盤,記錄上內部的XA事務的ID,同時將Redo log設置為Prepare狀態,Redo log寫入成功,再將Binlog同樣刷入磁盤,記錄XA事務的ID

Commit階段,向磁盤種的Redo log寫入Commit標識,表示事務提交,然后執行器調用存儲引擎的接口提交事務.

驗證

我們來驗證兩階段提交是否可以保證一致性
首先,假設Redo log 刷入成功,但是還沒來得及刷入Binlog,此時宕機,重啟之后發現Redo log 沒有commit標志,那么就會根據記錄的XA事務Id找到這個事務,然后回滾

如果Redo log刷入成功,Binlog也刷入成功,還沒來得及將Redo log從Prepare改成Commit,MySQL宕機,重啟之后,發現雖然Redo log雖然沒有commit標志,但是通過XA事務ID查詢到的Binlog已經刷入到磁盤中去了額,此時MySQL也會提交事務

我比較困惑的時候,如果Redo log刷入盤了,打上了Prepare標志,但是寫Binlog寫到一半的時候,突然MySQL宕機了,此時還會有一致性問題,這里我先放下,之后我懂了再來更新這里的問題

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

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

相關文章

python封裝,繼承,復寫詳解

目錄 1.封裝 2.繼承 復寫和使用父類成員 1.封裝 class phone:__voltage 0.5def __keepsinglecore(self):print("單核運行")def callby5g(self):if self.__voltage > 1:print("5g通話開啟")else:self.__keepsinglecore()print("不能開啟5g通…

Redis集群(主從)

1.主從集群 集群結構: 一.單機安裝redis 1.上傳壓縮包并解壓,編譯 tar -xzf redis-6.2.4.tar.gz cd redis-6.2.4 make && make install 2.修改redis.config的配置并啟動redis # 綁定地址,默認是127.0.0.1,會導致只能在本地訪問。…

Tomcat布署及優化-----JDK和Tomcat

1.Tomcat簡介 Tomcat 是 Java 語言開發的,Tomcat 服務器是一個免費的開放源代碼的 Web 應用服務器,Tomcat 屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試 JSP 程序的首選。一般來說&…

C++ //練習 10.2 重做上一題,但讀取string序列存入list中。

C Primer(第5版) 練習 10.2 練習 10.2 重做上一題,但讀取string序列存入list中。 環境:Linux Ubuntu(云服務器) 工具:vim 代碼塊 /******************************************************…

Vue前端加密后的數據發送到服務器端

首先,定義了一個名為 PUBLIC_KEY 的公鑰和一個名為 PRIVATE_KEY 的私鑰。然后,通過 JSEncrypt 創建了兩個實例 encrypt 和 decrypt,分別用于加密和解密操作。 對于加密操作,調用了 encrypt.setPublicKey() 方法設置公鑰&#xff…

升級Centos7的openssh到openssh-9.6p1版本 shell腳本 漏掃整改

升級Centos7的openssh到openssh-9.6p1版本 shell腳本 漏掃整改 #!/bin/bash# 聲明: 該腳本適用于升級Centos7的openssh到openssh-9.6p1版本# 定義源碼包版本號 OPENSSH_VERSIONopenssh-9.6p1 OPENSSL_VERSIONopenssl-3.2.1 ZILB_VERSIONzlib-1.3.1# 安裝編譯環境 yum -y insta…

【前端面試題5】利用 border 屬性畫一個三角形

舉例1:利用 border 屬性畫一個三角形(小技巧) 完整代碼如下: div{width: 0;height: 0;border: 50px solid transparent;border-top-color: red;border-bottom: none; }步驟如下: (1)當我們設…

【QT+QGIS跨平臺編譯】之五十六:【QGIS_CORE跨平臺編譯】—【qgsmeshcalclexer.cpp生成】

文章目錄 一、Flex二、生成來源三、構建過程一、Flex Flex (fast lexical analyser generator) 是 Lex 的另一個替代品。它經常和自由軟件 Bison 語法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用 C 語言寫成。 “flex 是一個生成掃描器的工具,能夠識別文本中…

Android 拍照本地圖片選擇框架適配

前言 通常技術方案的選擇、會帶來后續一些不可控的東西,這也是沒法避免的,程序開發者中同時面對、測試、領導、產品各種要求。同時在網絡上查找的資料也只是很舊的,不一定適合新設備,需要推倒重新弄 1、解決方案通過意圖選擇器做…

day6 數組 嵌套循環

1&#xff1a;打印楊輝三角 91 int arr[6][6];92 int i,j0;93 for(i0;i<6;i)94 {95 for(j0;j<i;j) 96 {97 if(j0||ij)98 {99 arr[i][j]1; …

2024-3-4 如何寫出具有python風格的代碼

寫出具有python風格的代碼 什么是python風格如何寫出具有python風格的自定義數據類型 什么是python風格 python風格是指自定義的數據類型表現得得與內置類型一樣。比如&#xff0c;我創建了一個類&#xff0c;它的實例不用調用類的方法就可以實現迭代、切片&#xff0c;可以直…

推特API(Twitter API)對接說明,用戶code To Token換取

前期準備 提前準備、說明&#xff1a;目前對接推特api開發門戶分為3個版本&#xff0c;分別是免費的&#xff0c;100美金一個月的基礎版以及5000美金一個月的企業版&#xff0c;免費的目前就兩個接口可以調用&#xff0c;所以想要對接和使用推特最基本的也需要付100美元一個月…

百度百科人物創建要求是什么?

百度百科作為我國最大的中文百科全書&#xff0c;其收錄的人物詞條要求嚴謹、客觀、有權威性。那么&#xff0c;如何撰寫一篇高質量的人物詞條呢&#xff1f;本文伯樂網絡傳媒將從內容要求、注意事項以及創建流程與步驟三個方面進行詳細介紹。 一、內容要求 1. 基本信息&#…

什么是 web 應用的 type-ahead search help

在 Web 前端設計領域&#xff0c;type-ahead search help&#xff08;又稱為自動完成或即時搜索&#xff09;是一種用戶界面功能&#xff0c;它能夠在用戶輸入搜索詞的同時&#xff0c;實時提供搜索建議或結果。這種功能極大地提升了用戶體驗&#xff0c;因為它可以幫助用戶快速…

LeetCode每日一題【c++版】- 用隊列實現棧與用棧實現隊列

用隊列實現棧 題目描述 請你僅使用兩個隊列實現一個后入先出&#xff08;LIFO&#xff09;的棧&#xff0c;并支持普通棧的全部四種操作&#xff08;push、top、pop 和 empty&#xff09;。 實現 MyStack 類&#xff1a; void push(int x) 將元素 x 壓入棧頂。int pop() 移除…

Studio One 6永久激活版 附完整圖文安裝破解教程

Studio One 6是一款功能強大的音樂制作和錄音軟件&#xff0c;專為Mac操作系統設計。它提供了多軌錄音和混音、MIDI音樂制作、實時效果和處理、VST插件支持以及高級編輯和編排等豐富的功能。無論是專業音樂制作人還是音樂愛好者&#xff0c;都可以使用Studio One 6來創建和編輯…

程序員英語詞匯寶典(建議收藏)

很多小伙伴說&#xff0c;英文不好能不能學習編程&#xff0c;我個人的看法是英文不好&#xff0c;并不影響你學習編程&#xff0c;但有可能會影響到你的編程上限&#xff0c;因為一些最新的文檔都是英文的。如果你想成為一個編程大牛&#xff0c;那么英文還是很有必要的。今天…

cocos-lua定時器用法

本文介紹cocos-lua(非Quick-cocos)的定時器用法 定時器按是否會隨節點銷毀&#xff0c;可分為節點調度器和全局調度器 一.節點調度器 frameworks\cocos2d-x\cocos\scripting\lua-bindings\script\cocos2d\deprecated.lua中實現了了schedule和 performWithDelay 1.1.schedul…

基礎真空技術外國文獻Fundamentals of Vacuum Technology

基礎真空技術外國文獻Fundamentals of Vacuum Technology

道路積水監測站——確保道路暢通和行車安全

TH-JS1道路積水監測站是一種專門用于監測城市道路積水情況的設備&#xff0c;旨在保障城市道路安全和防止水患對交通造成的不利影響。這些監測站通過實時檢測和記錄道路積水數據&#xff0c;為城市管理部門提供重要信息&#xff0c;以便及時采取應對措施&#xff0c;確保道路暢…