redo log詳解

在 MySQL 中,Redo Log(重做日志) 是 InnoDB 存儲引擎實現事務持久性(ACID 中的 D) 的核心機制,同時也通過 “預寫日志(Write-Ahead Logging, WAL)” 策略提升了數據寫入性能。它記錄的是數據頁的物理修改操作(而非 SQL 邏輯),用于在數據庫崩潰后恢復未持久化到磁盤的數據,避免事務丟失。

目錄

核心作用

存儲形式:文件組形式存儲

寫入方式:循環寫入

寫入策略:由innodb_flush_log_at_trx_commit參數控制

參數設置與查看

參數選型

寫入流程

核心參數選型與設置

選型

查看與設置語法

配置注意事項

Redo Log 實際應用的常見誤區

Redo Log 的核心實際應用場景


?

核心作用

Redo Log 的核心目標是解決 “內存數據與磁盤數據不一致” 的問題,具體有兩大作用:

  • 保證事務持久性:即使數據庫在事務提交后、數據未刷入磁盤前崩潰,重啟后可通過 Redo Log 重新執行修改操作,將數據恢復到提交狀態,避免事務 “提交了但數據丟了”。
  • 提升寫入性能:InnoDB 的寫入并非直接將數據刷入磁盤(磁盤隨機寫速度慢),而是先修改內存中的數據頁(Buffer Pool),再異步將 Redo Log 刷入磁盤(順序寫速度快),后續由后臺線程(如page cleaner)將內存數據批量刷盤,大幅降低磁盤 IO 開銷。

存儲形式:文件組形式存儲

Redo Log 并非單文件,而是以日志文件組的形式存在(默認是ib_logfile0和ib_logfile1),文件大小和數量可通過配置調整:

配置參數核心作用默認值取值范圍 / 限制生產環境建議值關鍵注意事項
innodb_log_file_size定義單個 Redo Log 文件的大小,決定單文件可存儲的日志量48M- 最小值:無明確下限(通常不小于 1M)
- 最大值:單個文件無獨立上限,但需滿足?innodb_log_files_in_group * innodb_log_file_size ≤ 512G(整個日志文件組總大小上限)
2G - 4G1. 需平衡 “恢復速度” 與 “日志切換頻率”:
- 過小:日志切換頻繁,觸發 Checkpoint 次數多,增加 IO 開銷
- 過大:崩潰后掃描日志時間長,恢復速度慢
2. 修改需謹慎,需先停止 MySQL,刪除舊日志文件后重啟
innodb_log_files_in_group定義 Redo Log 文件組的文件數量,文件命名格式為?ib_logfile0ib_logfile1...2- 最小值:1
- 最大值:100
2 - 4 個1. 多文件通過 “循環寫” 機制避免單文件損壞導致日志丟失,提升可靠性
2. 數量并非越多越好:過多文件會增加日志管理開銷,2-4 個可滿足絕大多數場景需求
3. 需與?innodb_log_file_size?配合,確保總大小不超過 512G

寫入方式:循環寫入

當一組文件寫滿后,會切換到下一個文件;全部寫滿后,會覆蓋最早的日志(前提是這些日志對應的內存數據已刷入磁盤,即 “checkpoint” 完成)。

  • 核心指針:write pos(寫入位置) 和checkpoint(檢查點)
    用于管理 Redo Log 的寫入、循環覆蓋和失效日志清理,確保日志空間高效利用和數據安全。
    指針定義作用
    write pos(寫入位置)記錄當前 Redo Log 的下一個待寫入位置(指向日志文件中即將寫入新日志的位置)。標記日志的 已使用區域
    從 checkpoint 到 write pos 之間的區域,是已寫入但尚未被覆蓋的有效日志。
    checkpoint(檢查點)記錄已刷盤的日志位置(指向所有已寫入 Redo Log 中,對應的數據頁已刷入磁盤的最新位置)。標記日志的可覆蓋區域
    從日志起始位置到 checkpoint 之間的區域,是已失效的日志(對應數據已持久化),可被新日志覆蓋。
  • 循環寫入分析
    redo log 從頭開始寫,寫完一個文件繼續寫另一個文件,寫到最后一個文件末尾就又回到第一個文件開頭循環寫,如下圖所示:
    • 日志寫入:事務產生的 Redo Log 從write pos位置開始寫入,write pos隨寫入不斷后移(順時針移動)。如上圖所示,write pos寫到第 3 號文件末尾后就回到 0 號文件開頭。
    • 日志覆蓋:當write pos追上checkpoint時,說明日志文件組已寫滿,此時不能繼續寫入新日志,必須先觸發 Checkpoint 機制,推動checkpoint后移(釋放可覆蓋區域),才能繼續寫入。
    • checkpoint 推進:當觸發 Checkpoint(如日志快寫滿、臟頁比例過高)時,InnoDB 會將 Buffer Pool 中 “checkpoint到write pos之間的日志對應的臟頁” 刷入磁盤;刷盤完成后,checkpoint向后移動到最新位置,釋放出的區域可被新日志覆蓋。

寫入策略:由innodb_flush_log_at_trx_commit參數控制

參數設置與查看

# 查看innodb_flush_log_at_trx_commit參數值:
show variables like 'innodb_flush_log_at_trx_commit';
# 設置innodb_flush_log_at_trx_commit參數值(也可以在my.ini或my.cnf文件里配置):
set global innodb_flush_log_at_trx_commit=1;  


參數選型

參數值含義與行為數據安全性性能表現適用場景
1事務提交時,強制將 Redo Log 從緩沖區(Redo Log Buffer)刷入磁盤(通過?fsync?系統調用確保物理寫入)。最高:即使數據庫崩潰或服務器斷電,已提交事務的日志也不會丟失。較低:每次提交都觸發磁盤 IO,對高頻提交場景有性能影響。核心業務(如金融交易、訂單支付),對數據一致性要求極高的場景。
0事務提交時,不刷盤,僅將 Redo Log 寫入緩沖區;由后臺線程每 1 秒批量將緩沖區日志刷入磁盤。較低:若數據庫崩潰,可能丟失最后 1 秒內已提交的事務日志。最高:避免頻繁磁盤 IO,適合寫入密集型場景。非核心業務(如日志采集、臨時數據存儲),可接受少量數據丟失的場景。
2事務提交時,將 Redo Log 寫入操作系統緩存(OS Cache),不觸發?fsync;操作系統每 1 秒將緩存數據刷入磁盤。中等:若數據庫崩潰,操作系統緩存中的日志不會丟失;若服務器斷電,可能丟失操作系統緩存中的日志(通常不超過 1 秒)。中等:比 1 性能高(減少?fsync?開銷),比 0 安全性高。對性能有一定要求,且允許極短時間數據丟失的場景(如電商商品評論、非實時統計)。

寫入流程

核心參數選型與設置

選型

Redo Log 的參數配置直接影響數據庫的性能可靠性崩潰恢復速度,以下是核心參數的選型建議:

參數名稱功能描述可選值范圍選型建議決策依據
innodb_log_file_size單個 Redo Log 文件大小1M ~ 512G(受總大小限制)生產環境:2G ~ 4G
小型應用:512M ~ 1G
- 過小:日志切換頻繁,Checkpoint 觸發頻繁,IO 開銷大
- 過大:崩潰恢復時間長
- 需滿足:單個大小 × 文件數 ≤ 512G
innodb_log_files_in_groupRedo Log 文件數量1 ~ 100推薦:2 ~ 4 個(默認 2 個)- 數量過少:單文件損壞風險高
- 數量過多:管理開銷增加,2-4 個足以平衡可靠性與性能
innodb_flush_log_at_trx_commit日志刷盤策略0、1、2核心業務:1
非核心業務:2
測試 / 日志系統:0
- 1(最安全):事務提交即刷盤,無數據丟失
- 2(折中):提交寫 OS 緩存,秒級刷盤
- 0(最高性能):每秒批量刷盤,可能丟失 1 秒數據
innodb_log_buffer_sizeRedo Log 緩沖區大小默認 16M,最大無限制(通常≤1G)一般場景:默認 16M
大量短事務:64M ~ 256M
- 過小:頻繁刷盤(尤其大事務)
- 過大:內存浪費,超過 256M 收益有限

查看與設置語法

# 查看
show variables like '參數名';
# 設置
set global 參數名=目標值;  

配置注意事項

選擇配置時,需結合業務的數據安全等級、寫入頻率和硬件 IO 能力綜合決策,建議先在測試環境驗證后再應用到生產。以下為使用 redolog的常見注意事項。

  • 修改日志文件大小 / 數量的步驟
    1. 停止 MySQL 服務
    2. 刪除舊日志文件(ib_logfile0、ib_logfile1等)
    3. 修改配置文件
    4. 重啟 MySQL(自動生成新日志文件)
  • 總大小限制
    確保 innodb_log_files_in_group × innodb_log_file_size ≤ 512G,超出會導致啟動失敗。
  • 與其他參數的配合
    • 若innodb_flush_method = O_DIRECT(繞開 OS 緩存),innodb_flush_log_at_trx_commit=2等價于1的安全性
    • 高并發寫入場景,建議配合innodb_buffer_pool_size調大內存緩存
  • 監控與調優
    |通過SHOW ENGINE INNODB STATUS查看日志使用情況,若Log sequence number與Log flushed up to差距過大,可能需要調大innodb_log_buffer_size。

Redo Log 實際應用的常見誤區

  • 誤區 1:認為 “日志文件越大越好”
    • 錯誤認知:部分運維人員為減少切換頻率,將 innodb_log_file_size 設為 16G 甚至更大。
    • 風險:崩潰恢復時間會急劇增加(如 16G 的日志文件,恢復可能需要 30 分鐘以上),若業務要求 “快速恢復”,會導致長時間服務不可用。
    • 正確做法:單個文件大小不超過 4G,總大小控制在 16G 以內(除非業務對恢復時間無要求)。
  • 誤區 2:所有業務都用 innodb_flush_log_at_trx_commit=1
    • 錯誤認知:為 “絕對安全”,即使是非核心業務(如日志)也強制使用 1。
    • 問題:fsync() 操作會導致大量磁盤 IO 開銷,寫入性能下降 30%~50%,浪費硬件資源。
    • 正確做法:根據業務優先級選擇刷盤策略,非核心業務用 2 或 0,平衡性能與安全。
  • 誤區 3:忽略 Redo Log 與硬件的配合
    • 錯誤認知:只調優參數,不關注磁盤類型。
    • 問題:若 Redo Log 存儲在機械硬盤(HDD)上,即使參數優化,順序寫性能也有限(HDD 順序寫速度約 100MB/s);若存儲在 SSD 上,未開啟 innodb_flush_method=O_DIRECT,會導致 OS 緩存與 SSD 緩存疊加,增加延遲。
    • 正確做法:
      • Redo Log 優先存儲在 SSD 上,利用其高 IOPS 特性;
      • 開啟 innodb_flush_method=O_DIRECT,繞開 OS 緩存,直接寫入 SSD,減少延遲(需注意:此時 innodb_flush_log_at_trx_commit=2 等價于 1 的安全性,因為 SSD 掉電保護可避免 OS 緩存數據丟失)。

Redo Log 的核心實際應用場景

  • 支撐高并發寫入業務
    在電商秒殺、支付交易、日志采集等高頻寫入場景中,Redo Log 是性能保障的關鍵:
    • 原理:事務執行時,InnoDB 先將 “數據修改記錄”(如 “表 t1 的 id=1 行,name 從 A 改為 B”)寫入 Redo Log Buffer(內存緩沖區),再通過 “刷盤策略” 寫入磁盤上的 Redo Log 文件(順序寫,速度遠快于數據頁的隨機寫);事務提交后,無需等待數據頁立即刷盤,只需確保 Redo Log 已刷盤(即 “WAL 原則”)。
    • 實際效果:將 “數據頁隨機寫” 轉化為 “Redo Log 順序寫”,寫入性能提升 10~100 倍,支撐每秒數萬次的事務寫入。
  • 崩潰恢復(Crash Recovery)
    數據庫意外宕機(如斷電、進程崩潰)后,重啟時 InnoDB 會通過 Redo Log 恢復數據,避免事務丟失:
    • 恢復流程:
      1. 讀取 Redo Log 文件中 “未刷盤到數據頁” 的事務記錄(通過 Log Sequence Number 即 LSN 匹配,LSN 是 Redo Log 和數據頁的 “版本標識”);
      2. 重新執行這些記錄,將數據恢復到宕機前的狀態;
      3. 對 “未提交但已寫入 Redo Log” 的事務,通過 Undo Log 回滾,確保數據一致性。
    • 實際價值:金融、支付等核心業務依賴此機制實現 “零數據丟失”(需配合 innodb_flush_log_at_trx_commit=1)。
  • 減少數據頁刷盤頻率
    InnoDB 的數據頁(默認 16KB)刷盤成本高,Redo Log 允許數據頁 “延遲刷盤”:
    • 原理:事務修改數據時,先更新內存中的 “緩沖池(Buffer Pool)數據頁”,并記錄 Redo Log;數據頁只需在 “緩沖池滿”“Checkpoint 觸發” 或 “定時任務” 時刷盤,無需每次事務提交都刷盤。
    • 實際影響:減少磁盤 IO 次數,尤其在 “大量短事務” 場景中,可顯著降低 IO 壓力。

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

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

相關文章

Linux awk命令完全指南:從原理到實戰,搞定文本處理難題

在Linux世界里,文本處理是運維、開發繞不開的日常——從分析日志、提取配置信息到統計數據,都需要高效的工具支撐。而awk,作為一款強大的文本分析語言,憑借“按字段處理”的核心能力,成為了比grep(單純匹配…

畢業項目推薦:68-基于yolov8/yolov5/yolo11的水稻蟲害檢測識別系統(Python+卷積神經網絡)

文章目錄 項目介紹大全(可點擊查看,不定時更新中)概要一、整體資源介紹技術要點功能展示:功能1 支持單張圖片識別功能2 支持遍歷文件夾識別功能3 支持識別視頻文件功能4 支持攝像頭識別功能5 支持結果文件導出(xls格式…

Qt為什么要引入QML語言?

Qt發布于1991年,經過30多年的發展,Qt/C已經成為了眾多學子,拿來學習C的首選框架。Qt/Widgets,相對于其他界面庫(如GNOME、KDE),其實已經很優秀,已經可以成為number one了。在已經是第…

設計模式在Java中的應用:從單例模式到工廠模式的全面解析!

全文目錄:開篇語前言1. 單例模式:確保全局只有一個實例1.1 餓漢式單例1.2 懶漢式單例1.3 雙重檢查鎖定(DCL)2. 工廠模式:簡化對象創建2.1 簡單工廠模式2.2 工廠方法模式2.3 抽象工廠模式3. 其他設計模式3.1 觀察者模式…

Meta AIUCSD放大招:DeepConf 讓大語言模型推理既快又準,84.7%的token節省+近乎完美的準確率!

1. 【前言】 Meta&UCSD 大語言模型(LLMs) 在推理任務中通過自一致性等測試時縮放方法展現出巨大潛力,但存在精度收益遞減和計算開銷高的問題。為此,Meta與UCSD的研究人員提出DeepConf方法,它利用模型內部的置信度信…

解決leetcode第3671.子序列美麗值求和問題

3671. 子序列美麗值求和難度:困難問題描述:給你一個長度為 n 的整數數組 nums。對于每個 正整數 g,定義 g 的 美麗值 為 g 與 nums 中符合要求的子序列數量的乘積,子序列需要 嚴格遞增 且最大公約數(GCD)恰…

電機控制(一)-電機分類

電機分類 電機分類: 電機的拓撲模型并沒有發生太大變化,變化較大的是控制電機的方法。 常見的電機類型有: 步進電機vs伺服電機 在工業自動化、機器人、精密設備等領域,步進電機和伺服電機是兩種最常用的驅動電機,但兩者的核心…

【Qt】QToolBar、QToolButton的常用用法

一、QToolBar 常用用法 QToolBar 是 Qt 中用于創建工具欄的控件,可快速放置常用功能按鈕、分隔符或自定義控件,并支持拖動停靠、浮動等特性。 1. 基礎創建與添加到主窗口 // 在 QMainWindow 中創建工具欄 QToolBar *toolBar new QToolBar(tr("主工…

DVWA靶場通關筆記-驗證碼繞過Insecure CAPTCHA (Impossible級別)

目錄 一、reCAPTCHA 1、配置security為Impossible級別。 2、配置RECAPTCHA參數 3、再次打開靶場 二、源碼分析 1、index.php 2、impossible.php 3、功能函數 三、reCAPTCHA 防范分析 1、嚴格的參數驗證與處理 2、預處理防止SQL注入 3、CAPTCHA 驗證通過 4、驗證當前…

MySQL安裝(如果之前有安裝過MySQL,先執行下面的卸載流程)

1.安裝MySQL 1.1更新系統的軟件包列表 sudo apt-get update1.2安裝MySQL服務器 sudo apt-get install mysql-server1.3檢查MySQL服務是否啟動,若沒有啟動手動啟動若沒有啟動執行: sudo service mysql start1.4登錄MySQL(默認安裝之后不需要密…

Streamlit 數據看板模板:非前端選手快速搭建 Python 數據可視化交互看板的實用工具

你想想看,平時你用 Python 跑出來一堆數據 —— 比如用戶留存率、產品銷量變化,想給領導或者同事看,總不能直接發個 CSV 文件或者一堆靜態圖吧?對方看的時候還得自己翻數據,想對比下上個月和這個月的變化都費勁&#x…

FMC、FMC+ 詳解

文章目錄FMC 簡介FMC 引腳輸出定義High-pin count (HPC) connector, HPC pinoutLow-pin count (LPC) connector, LPC pinoutPin and signal descriptionFMC 簡介VITA57 標準更新歷史VITA57.4 標準推出的原因FMC 引腳輸出定義Altera 開發板的 FMC 引腳定義英特爾 Arria 10 GX FP…

小迪web自用筆記24

黑名單機制。如果被過濾可以試試PHP5看看過濾沒(或者其他變種變形),但是得看環境有些環境會被當成下載,有些會直接打開。白名單機制只允許這幾個特定后綴可以上傳,比黑名單更安全。直接從信息圖中獲取文件類型。文件類…

私有部署問卷系統、考試系統、投票系統、測評系統的最佳選擇-調問開源問卷表單(DWSurvey)

在選擇私有部署問卷系統的時候,調問問卷系統(DWSurvey)是一定要嘗試一下,而且可以應用到私有部署考試系統、私有部署投票系統、私有部署測評系統等多個應用場景。 私有部署問卷、考試、測評、投票系統的優勢不言而喻,就拿私有部署考試系統來說…

企業實用——MySQL的備份詳解

序言: 本次基于mysql8.0.40來給大家做數據庫的備份的實用技巧和思路!對于mysql基礎的部分后續我會節選部分給大家講解,本篇文章適合有一定數據庫基礎的小伙伴看。 目錄 一、MySQL備份概述 1、關于數據保存你要知道 2、到底要備份什么 備份什么 MySQL體系結構(MySQL =…

使用 FunASR 工具包實現音頻文件的語音識別

使用 FunASR 工具包實現音頻文件的語音識別,并將識別結果保存為文本文件,支持單文件處理和批量處理。電腦環境需要配置,我使用的PyTorch版本: 2.4.1cu121,CUDA可用: True。FunASR 是一個功能強大、性能卓越、面向工業應用的語音識…

【STM32】定時器編碼器接口

【STM32】定時器編碼器接口一、編碼器接口1.1 正交編碼器1.2 編碼器接口基本結構1.3 工作模式二、編碼器接口測速一、編碼器接口 編碼器接口可接收增量(正交)編碼器的信號,根據編碼器旋轉產生的正交信號脈沖,自動控制CNT的自增或…

浪潮科技Java開發面試題及參考答案(120道題-中)

請介紹一下 SpringMVC 的運行流程?從用戶發送請求到響應返回的完整步驟是什么?SpringMVC 是基于MVC架構的Web框架,其運行流程圍繞“前端控制器(DispatcherServlet)”展開,通過多個組件協同工作,…

k8s初始化常見問題

執行初始化:kubeadm init --apiserver-advertise-address192.168.88.110 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr10.244.0.0/16 --control-plane-endpointweb01報錯信息:age-repository registry.aliyuncs.com/…

Python學習筆記--使用Django修改和刪除數據

一、修改方式一:模型類的對象.屬性 更改的屬性值,模型類的對象.save()返回值:編輯的模型類的對象。def update_book(request):book models.Book.objects.filter(pk1).first()book.price "169"book.save()return HttpResponse(bo…