MySQL,MariaDB:Undo | Redo [轉]

来源:http://www.cnblogs.com/f1194361820/archive/2016/12/18/6195546.html
-Advertisement-
Play Games

本文是介紹MySQL資料庫InnoDB存儲引擎重做日誌漫游 00 – Undo LogUndo Log 是為了實現事務的原子性,在MySQL資料庫InnoDB存儲引擎中,還用Undo Log來實現多版本併發控制(簡稱:MVCC)。 - 事務的原子性(Atomicity) 事務中的所有操作,要麼全部完 ...


本文是介紹MySQL資料庫InnoDB存儲引擎重做日誌漫游

00 – Undo Log
Undo Log 是為了實現事務的原子性,在MySQL資料庫InnoDB存儲引擎中,還用Undo Log來實現多版本併發控制(簡稱:MVCC)。

- 事務的原子性(Atomicity)
  事務中的所有操作,要麼全部完成,要麼不做任何操作,不能只做部分操作。如果在執行的過程中發生
  了錯誤,要回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過。

- 原理
  Undo Log的原理很簡單,為了滿足事務的原子性,在操作任何數據之前,首先將數據備份到一個地方
  (這個存儲數據備份的地方稱為Undo Log)。然後進行數據的修改。如果出現了錯誤或者用戶執行了
  ROLLBACK語句,系統可以利用Undo Log中的備份將數據恢復到事務開始之前的狀態。

除了可以保證事務的原子性,Undo Log也可以用來輔助完成事務的持久化。

- 事務的持久性(Durability)
  事務一旦完成,該事務對資料庫所做的所有修改都會持久的保存到資料庫中。為了保證持久性,資料庫
  系統會將修改後的數據完全的記錄到持久的存儲上。

- 用Undo Log實現原子性和持久化的事務的簡化過程
  假設有A、B兩個數據,值分別為1,2。
  A.事務開始.
  B.記錄A=1到undo log.
  C.修改A=3.
  D.記錄B=2到undo log.
  E.修改B=4.
  F.將undo log寫到磁碟。
  G.將數據寫到磁碟。
  H.事務提交
  這裡有一個隱含的前提條件:‘數據都是先讀到記憶體中,然後修改記憶體中的數據,最後將數據寫回磁碟’。

  之所以能同時保證原子性和持久化,是因為以下特點:
  A. 更新數據前記錄Undo log。
  B. 為了保證持久性,必須將數據在事務提交前寫到磁碟。只要事務成功提交,數據必然已經持久化。
  C. Undo log必須先於數據持久化到磁碟。如果在G,H之間系統崩潰,undo log是完整的,
     可以用來回滾事務。
  D. 如果在A-F之間系統崩潰,因為數據沒有持久化到磁碟。所以磁碟上的數據還是保持在事務開始前的狀態。

缺陷:每個事務提交前將數據和Undo Log寫入磁碟,這樣會導致大量的磁碟IO,因此性能很低。

如果能夠將數據緩存一段時間,就能減少IO提高性能。但是這樣就會喪失事務的持久性。因此引入了另外一
種機制來實現持久化,即Redo Log.

01 – Redo Log

- 原理
  和Undo Log相反,Redo Log記錄的是新數據的備份。在事務提交前,只要將Redo Log持久化即可,
  不需要將數據持久化。當系統崩潰時,雖然數據沒有持久化,但是Redo Log已經持久化。系統可以根據
  Redo Log的內容,將所有數據恢復到最新的狀態。

- Undo + Redo事務的簡化過程
  假設有A、B兩個數據,值分別為1,2.
  A.事務開始.
  B.記錄A=1到undo log.
  C.修改A=3.
  D.記錄A=3到redo log.
  E.記錄B=2到undo log.
  F.修改B=4.
  G.記錄B=4到redo log.
  H.將redo log寫入磁碟。
  I.事務提交

Undo + Redo事務的特點
  A. 為了保證持久性,必須在事務提交前將Redo Log持久化。
  B. 數據不需要在事務提交前寫入磁碟,而是緩存在記憶體中。
  C. Redo Log 保證事務的持久性。
  D. Undo Log 保證事務的原子性。
  E. 有一個隱含的特點,數據必須要晚於redo log寫入持久存儲。

- IO性能
  Undo + Redo的設計主要考慮的是提升IO性能。雖說通過緩存數據,減少了寫數據的IO.
  但是卻引入了新的IO,即寫Redo Log的IO。如果Redo Log的IO性能不好,就不能起到提高性能的目的。
  為了保證Redo Log能夠有比較好的IO性能,InnoDB 的 Redo Log的設計有以下幾個特點:

  A. 儘量保持Redo Log存儲在一段連續的空間上。因此在系統第一次啟動時就會將日誌文件的空間完全分配。
     以順序追加的方式記錄Redo Log,通過順序IO來改善性能。
  B. 批量寫入日誌。日誌並不是直接寫入文件,而是先寫入redo log buffer.當需要將日誌刷新到磁碟時
     (如事務提交),將許多日誌一起寫入磁碟.
  C. 併發的事務共用Redo Log的存儲空間,它們的Redo Log按語句的執行順序,依次交替的記錄在一起,
     以減少日誌占用的空間。例如,Redo Log中的記錄內容可能是這樣的:
     記錄1: <trx1, insert …>
     記錄2: <trx2, update …>
     記錄3: <trx1, delete …>
     記錄4: <trx3, update …>
     記錄5: <trx2, insert …>
  D. 因為C的原因,當一個事務將Redo Log寫入磁碟時,也會將其他未提交的事務的日誌寫入磁碟。
  E. Redo Log上只進行順序追加的操作,當一個事務需要回滾時,它的Redo Log記錄也不會從
     Redo Log中刪除掉。

02 – 恢復(Recovery)

- 恢復策略
  前面說到未提交的事務和回滾了的事務也會記錄Redo Log,因此在進行恢復時,這些事務要進行特殊的
  的處理.有2中不同的恢復策略:

  A. 進行恢復時,只重做已經提交了的事務。
  B. 進行恢復時,重做所有事務包括未提交的事務和回滾了的事務。然後通過Undo Log回滾那些
     未提交的事務。

- InnoDB存儲引擎的恢復機制
  MySQL資料庫InnoDB存儲引擎使用了B策略, InnoDB存儲引擎中的恢復機制有幾個特點:

  A. 在重做Redo Log時,並不關心事務性。 恢復時,沒有BEGIN,也沒有COMMIT,ROLLBACK的行為。
     也不關心每個日誌是哪個事務的。儘管事務ID等事務相關的內容會記入Redo Log,這些內容只是被當作
     要操作的數據的一部分。
  B. 使用B策略就必須要將Undo Log持久化,而且必須要在寫Redo Log之前將對應的Undo Log寫入磁碟。
     Undo和Redo Log的這種關聯,使得持久化變得複雜起來。為了降低複雜度,InnoDB將Undo Log看作
     數據,因此記錄Undo Log的操作也會記錄到redo log中。這樣undo log就可以象數據一樣緩存起來,
     而不用在redo log之前寫入磁碟了。
     包含Undo Log操作的Redo Log,看起來是這樣的:
     記錄1: <trx1, Undo log insert <undo_insert …>>
     記錄2: <trx1, insert …>
     記錄3: <trx2, Undo log insert <undo_update …>>
     記錄4: <trx2, update …>
     記錄5: <trx3, Undo log insert <undo_delete …>>
     記錄6: <trx3, delete …>
  C. 到這裡,還有一個問題沒有弄清楚。既然Redo沒有事務性,那豈不是會重新執行被回滾了的事務?
     確實是這樣。同時Innodb也會將事務回滾時的操作也記錄到redo log中。回滾操作本質上也是
     對數據進行修改,因此回滾時對數據的操作也會記錄到Redo Log中。
     一個回滾了的事務的Redo Log,看起來是這樣的:
     記錄1: <trx1, Undo log insert <undo_insert …>>
     記錄2: <trx1, insert A…>
     記錄3: <trx1, Undo log insert <undo_update …>>
     記錄4: <trx1, update B…>
     記錄5: <trx1, Undo log insert <undo_delete …>>
     記錄6: <trx1, delete C…>
     記錄7: <trx1, insert C>
     記錄8: <trx1, update B to old value>
     記錄9: <trx1, delete A>
     一個被回滾了的事務在恢復時的操作就是先redo再undo,因此不會破壞數據的一致性.

- InnoDB存儲引擎中相關的函數
  Redo: recv_recovery_from_checkpoint_start()
  Undo: recv_recovery_rollback_active()
  Undo Log的Redo Log: trx_undof_page_add_undo_rec_log()

 


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

-Advertisement-
Play Games
更多相關文章
  • 本案例來自React.js中文官網對應內容。 一. 運行環境 二. 組件架構 App下有兩個子組件 (評論列表)和 (評論區),其中 下又有一個子組件 (評論) Comment包括一個h2的評論人名稱,一個span的評論內容,獲取數據之後,Comment組件以數組的形式傳入CommentList。 ...
  • 1.html 2.app.js ...
  • 1.定義變數:Sass中定義變數的關鍵字是'$'(畢竟程式員缺錢),並使用冒號(:)進行賦值,例如: $width:200px;//定義了一個名為width的變數,值為200px 2.普通變數和預設變數: 普通變數便是我們在大括弧外用上面的方式聲明的變數,可全局使用。 預設變數需要在聲明的變數後加上 ...
  • 關於排序,其實不管是哪種語言,都有它內置的排序函數,我們要用的時候調用就行了,既然如此,我們為什麼還要講這個東西呢?我想,其實,我們講排序更多是在於排序中包含的思想演算法,因為,演算法對於電腦來說相當重要,一個好的演算法能夠讓電腦的效率達到事半功倍的效果,所以,演算法是電腦語言中一門相當熱門的課程,它 ...
  • var http = require( 'http' ) var handlePaths = [] /** * 初始化路由配置數組 */ function initRotute() { handlePaths.push( '/' ) handlePaths.push( '/login' ) hand... ...
  • 1、相關環境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 hbase1.2.4 本篇文章僅涉及hbase集群的搭建,關於hadoop與zookeeper的相關部署參見上篇文章http://www.cnblogs.com/learn21cn/p/6184490. ...
  • $slice 如果希望數組的最大長度是固定的,那麼可以將 $slice 和 $push 組合在一起使用,就可以保證數組不會超出設定好的最大長度。$slice 的值必須是負整數。 假設$slice的值為10,如果$push 後的數組的元素個數小於10,那麼所有元素都會保留。反之,只有最後那10個元素會 ...
  • 本文是在Cat Qi的原貼的基礎之上,經本人逐題分別在MySql資料庫中實現的筆記,持續更新... 參考原貼:http://www.cnblogs.com/qixuejia/p/3637735.html 01 表結構 Student(Sno,Sname,Sage,Ssex) 學生表 Course(C ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...