innodb二階段日誌提交機制

来源:https://www.cnblogs.com/leohahah/archive/2018/01/02/8176553.html
-Advertisement-
Play Games

前些天在查看關於innodb_flush_log_at_trx_commit的官網解釋時產生了一些疑問,關於innodb_flush_log_at_trx_commit參數的詳細解釋參見官網: https://dev.mysql.com/doc/refman/5.7/en/innodb-parame ...


前些天在查看關於innodb_flush_log_at_trx_commit的官網解釋時產生了一些疑問,關於innodb_flush_log_at_trx_commit參數的詳細解釋參見官網:

https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

其中有一段是這麼寫的: With a value of 2, the contents of the InnoDB log buffer are written to the log file after each transaction commit and the log file is flushed to disk approximately once per second. 意思是:如果innodb_flush_log_at_trx_commit的值設為2,那麼log buffer里的內容會在每次提交時被寫入log file,然後logfile也會被flush到disk。 由於innodb的log file據我所知是在硬碟上的ib_logfile,所以對於這裡的log file被flush到disk很疑惑,難道log buffer和disk之間還存在了一層可以緩存log file的結構?   在查閱了大量中英文資料後,總算有了初步的瞭解,暫總結於此。   一、名詞解釋 在innodb存儲引擎中,有一種獨有的log file,即redo log file,因此對於innodb存儲引擎來說,就存在兩種logfile:redo log和binlog. redo log:即data目錄下的ib_logfile0,ib_logfile1(個數由innodb_log_files_in_group控制),innodb存儲引擎特有,在記憶體中有相應的redo log buffer。 因此寫redo時的3層結構為:redo log buffer--->文件系統緩存中的redo logfile--->disk上的redo log file binlog:預設在data目錄下,也可以通過log_bin參數直接指定路徑,文件名為預設為<hostname>-bin首碼的文件,在記憶體中沒有log buffer。 因此寫binlog時的2層結構為:文件系統緩存中的binlog--->disk上的binlog   二、二階段日誌寫的流程 原圖來自:https://jin-yang.github.io/post/mysql-group-commit.html 當開啟binlog後,如果會話發出了commit的請求,那麼在committed之前,一系列的流程為: 1.prepare階段: 將log buffer的事務更改和事務commit信息寫入文件系統緩存中的redo log file,註意log buffer和undo buffer(也叫undo page)是在事務執行過程中就即時生成的(undo預設在系統表空間中,5.6以後也可以自己指定獨立的表空間),文件系統緩存中的redo log 是否flush到disk,取決於innodb_flush_log_at_trx_commit參數。 innodb_flush_log_at_trx_commit:
  • 此值為0表示:redo log buffer的內容每秒會被寫入文件系統緩存的redo log里,同時被flush(固化)到disk上的redo log file中。
  • 此值為1表示:redo log buffer的內容會在事務commit時被寫入文件系統緩存的redo log里,同時被flush(固化)到disk上的redo log file中。
  • 此值為2表示:redo log buffer的內容會在事務commit時被寫入文件系統緩存的redo log里,而文件系統緩存的redo log每秒一次被flush(固化)到disk上的redo log file中。
2.寫binlog階段: 此階段調用兩個方法write()和fsync(),前者負責寫文件系統緩存中的binlog,後者負責將文件系統緩存中的binlog寫入disk上的bin log,前者在此階段一定會被調用,後者的調用機制由sync_binlog參數控制。 關於sync_binlog參數:
  • sync_binlog=0:表示fsync()的調用完全交給操作系統,即文件系統緩存中的binlog是否刷新到disk完全由操作系統控制。
  • sync_binlog=1:表示在事務提交時,binlog一定會被固化到disk
  • sync_binlog=N(N>1):資料庫崩潰時,可能會丟失N-1個事務,具體原理也詳見https://jin-yang.github.io/post/mysql-group-commit.html
3.最終commit階段: 此階段主要包含:server告訴存儲引擎,binlog和redo log都已寫好(至少在文件系統緩存級別已經寫好),按正常機制提交數據吧,然後向會話返回committed的確認提交信息。   三、故障恢復解析 1.如果在一階段後崩潰,那麼由於binlog未寫,數據顯然未能提交,算是失敗的事務,無需前滾或回滾。(對於oracle資料庫則情況更為複雜,有些大事務即便未提交也可能有已經固化的數據,那麼就需要進行回滾。還不清楚mysql的大事務是否也有未提交數據提前寫入disk的機制) 2.如果在二階段後崩潰,那麼只有一種情況可以保證數據完全不丟失,即:innodb_flush_log_at_trx_commit和sync_binlog都設置為1,此時redo log和binlog都被固化到磁碟,可以保證commit後未寫入的數據在recovery時被前滾提交。如果任意一個不為1,那麼都可能造成binlog和redo log不一致的情況,此時很可能丟失事務。 因此,為保證主從完全一致,主庫的innodb_flush_log_at_trx_commit和sync_binlog都必須設置為1。   至於5.6以後的為解決併發事務提交異常而出現的3階段組提交機制,有待繼續研究。

 


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

-Advertisement-
Play Games
更多相關文章
  • Mysql資料庫知識點 1.管理資料庫語句: 使用資料庫: use test; 添加資料庫: create database 資料庫名; create database test; 修改資料庫: alter database 資料庫名; alter database test; 刪除資料庫: dro ...
  • 今天在用一鍵安裝mysql的shell腳本安裝mysql-5.1.73軟體後發現mysql始終無法啟動,多次執行後依舊報錯,只能去查看error日誌,發現瞭如下的2個錯誤: 錯誤一:Fatal error: Can't open and lock privilege tables: Table 'm ...
  • 一、SQL數據查詢的一般格式 數據查詢是資料庫的核心操作。SQL提供了SELECT語句進行數據查詢,其一般格式為: 整個SELECT語句的含義是,根據WHERE子句的條件表達式從FROM子句指定的基本表、視圖或派生表中找出滿足條件的元組,再按SELECT子句中的目標列表達式選出元組中的屬性值形成結果 ...
  • 第一節 安裝環境 1 環境說明 服 務 商 : Alibaba Cloud Elastic Compute Service 操作系統 : CENTOS 7.4 版 本 號 : Linux version 3.10.0-693.2.2.el7.x86_64 安裝日期 : 2017年10月30日 安裝人 ...
  • 今天遇到一個很奇葩的問題,也可能是自己的經驗不足。。。 搜索的時候竟然用了兩秒鐘,當然是建了索引的(非聚集索引),這個時候搜索竟然 聚集索引掃描........ 然後通過加了一個語句,提升到了19毫秒 使用的是MsSqlserver 然後在網上找了一些資料也不能找到原因。 瞭解的大神們,懂得留個言。 ...
  • 用戶對物品的評分矩陣 × 物品相似矩陣 = 推薦列表 構建物品相似度矩陣的時候可以通過計算兩個物品的餘弦相似度得出,於是需要構建每個物品在所有用戶中的評分矩陣 本例中,不採用餘弦相似度的方式計算物品與物品相似度 在MapReduce作業中,輸入數據的格式是:用戶,物品,評分 第一步、構建用於評分矩陣 ...
  • 本來之前以為,not exists 和之前的參數一樣的也是需要分情況來說,但是做了實驗測試之後發現。Not exists 和not in 的選擇方法十分的簡單,就是只選 not exists 因為 not in加上了不會走索引。而not exists 會走。這樣就限定了,如果要使用的話就儘可能使用n ...
  • 在mysql中,通過一張表的列修改另一張關聯表中的內容: 1: 修改1列 update student s, city c set s.city_name = c.name where s.city_code = c.code; 2: 修改多個列 update a, b set a.title=b. ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...