最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL之redo?log與binlog用法及說(shuō)明

 更新時(shí)間:2026年05月02日 15:01:52   作者:北綠蟻  
本文主要介紹了MySQL?InnoDB存儲(chǔ)引擎的重做日志(redolog)和二進(jìn)制日志(binlog)的相關(guān)知識(shí),包括它們的定義、作用、寫(xiě)入方式、恢復(fù)過(guò)程、適用模式及區(qū)別等

讀這篇文章前,可以先看看前文 MySQL——update 語(yǔ)句執(zhí)行流程,以便對(duì)整體有個(gè)大概的了解。

一、重做日志(redo log)

InnoDB 存儲(chǔ)引擎會(huì)使用重做日志文件恢復(fù)到掉電前的時(shí)刻,以此來(lái)保證數(shù)據(jù)的完整性。

redo log 是物理日志,記錄的是“在某個(gè)數(shù)據(jù)頁(yè)上做了什么修改”;

  • 采用 WAL(Write Ahead Log)策略,事務(wù)提交時(shí),先寫(xiě)重做日志再修改頁(yè);
  • 每個(gè) InnoDB 存儲(chǔ)引擎至少有 1 個(gè)重做日志文件組(group),每個(gè)文件組下至少有 2 個(gè)重做日志文件(如默認(rèn)的 ib_logfile0 和 ib_logfile1);
  • 可以設(shè)置多個(gè)鏡像日志組,將不同的文件組放在不同磁盤(pán)上,以提高重做日志的高可用性;
  • 在日志組中每個(gè)重做日志文件大小一致,并以循環(huán)寫(xiě)入的方式運(yùn)行;

表1 重做日志文件參數(shù)

重做日志文件參數(shù)作用大小
innodb_log_file_size指定每個(gè)重做日志文件的大小最大 512GB
innodb_log_files_in_group指定日志文件組中重做日志文件的數(shù)量默認(rèn)為 2
innodb_mirrored_log_groups指定日志鏡像文件組的數(shù)量默認(rèn)為 1,表示只有一個(gè)日志文件組,沒(méi)有鏡像
innodb_log_group_home_dir指定日志文件組所在路徑默認(rèn) ./ 表示在 MySQL數(shù)據(jù)庫(kù)的數(shù)據(jù)目錄下

下圖 1 以一個(gè)重做日志文件組中有四個(gè)重做日志文件為例,每個(gè)日志文件大小最大只能 512GB。

圖1 redo log 文件結(jié)構(gòu)圖

  • 重做日志文件設(shè)置過(guò)大 —— 恢復(fù)時(shí)間長(zhǎng)。
  • 重做日志文件設(shè)置過(guò)小 —— 可能導(dǎo)致一個(gè)事務(wù)的日志需要多次切換重做日志文件。且會(huì)導(dǎo)致頻繁地發(fā)生 async checkpoint,導(dǎo)致性能的抖動(dòng)。

重做日志文件組

在每個(gè)組的第一個(gè)redo log file中,前四個(gè)塊記錄特定部分(2KB),之后才開(kāi)始記錄 log block。除了第一個(gè) redo log file 中會(huì)記錄,log group 中的其他 log file 不會(huì)記錄這2KB,但是卻會(huì)騰出這 2KB 的空間。

圖2 redo log 寫(xiě)入過(guò)程

圖2 redo log 寫(xiě)入過(guò)程

重做日志緩沖(內(nèi)存中)寫(xiě)入磁盤(pán)的重做日志文件時(shí),按 512 字節(jié)(一個(gè)扇區(qū)大?。?,因?yàn)樯葏^(qū)是寫(xiě)入的最小單位,因此可以保證寫(xiě)入必定是成功的。因此在重做日志的寫(xiě)入過(guò)程中不需要有 doublewrite

重做日志格式

在 InnoDB 存儲(chǔ)引擎中,對(duì)于各種不同的操作有著不同的重做日志格式。到 InooDB 1.2.x 版本為止,總共定義了 51 種重做日志類型(例如下圖3 insert 語(yǔ)句和 delete 語(yǔ)句寫(xiě)入 redo_log_body 內(nèi)容是不一樣的)。雖然各種重做日志類型不同,但是它們有著基本的格式,下表 2 顯示了重做日志條目的結(jié)構(gòu)。

表2 重做日志條目結(jié)構(gòu)

redo_log_typespacepage_noredo_log_body

圖3 不同重做日志格式

可以從上表 2 中看到,重做日志由 4 部分組成。

表3 重做日志條目結(jié)構(gòu)解釋

組成部分作用大小
redo_log_type表示重做日志類型1 字節(jié)
space表示表空間的 ID采用壓縮方式,占用空間可能小于 4 字節(jié)
page_no表示頁(yè)的偏移量采用壓縮方式
redo_log_body表示每個(gè)重做日志的數(shù)據(jù)部分恢復(fù)時(shí)需要調(diào)用相應(yīng)的函數(shù)進(jìn)行解析

表空間ID + 頁(yè)號(hào) 即可唯一定位需要進(jìn)行修改的頁(yè)。

重做日志塊

redo log 是基于頁(yè)的格式來(lái)記錄的,innodb 的頁(yè)大小默認(rèn)是16KB(由 innodb_page_size變量控制),一個(gè)頁(yè)中可以存放多個(gè) redo log block 重做日志塊(512B),

圖4 重做日志塊

redo log恢復(fù)

假如數(shù)據(jù)在 LSN:10 000 的時(shí)候宕機(jī)了,則恢復(fù) LSN:10 000 到 LSN:13 000 范圍的日志,因?yàn)榇藭r(shí) CP 的 LSN 為 10 000。

圖5 重做日志數(shù)據(jù)恢復(fù)

刷盤(pán)時(shí)機(jī)

重做日志寫(xiě)入重做日志文件觸發(fā)條件:

  1. 主線程中每秒會(huì)將重做日志緩沖寫(xiě)入磁盤(pán)的重做日文件中,不論事務(wù)是否提交。
  2. 參數(shù) innodb_flush_log_at_trx_commit 控制,表示在提交(commit)操作時(shí),處理重做日志的方式。
  3. 當(dāng)重做日志緩沖池剩余空間小于1/2時(shí),重做日志刷新到重做日志文件。

引發(fā)數(shù)據(jù)庫(kù)刷臟頁(yè)(flush)過(guò)程的情況:

  1. InnoDB 的 redo log 寫(xiě)滿時(shí),系統(tǒng)會(huì)停止所有的更新操作,把 checkpoint 往前推進(jìn)(如圖1),redo log 留出空間繼續(xù)寫(xiě)。
  2. 系統(tǒng)內(nèi)存不足時(shí),淘汰一些數(shù)據(jù)頁(yè),如果是臟頁(yè)則先刷到磁盤(pán)。
  3. MySQL 認(rèn)為系統(tǒng) ”空閑“ 時(shí),只要有機(jī)會(huì)就刷一點(diǎn) ”臟頁(yè)“。
  4. MySQL 正常關(guān)閉時(shí),MySQL 會(huì)把內(nèi)存的臟頁(yè)都 flush 到磁盤(pán)上。

二、二進(jìn)制日志(binlog)

binlog 是邏輯日志,記錄的是這個(gè)語(yǔ)句的原始邏輯,比如“給ID=2這一行的c字段加1 ”。

其有以下三大模式。

參數(shù)設(shè)置: binlog_format

Statement,基于 SQL 語(yǔ)句復(fù)制(statement-based replication, SBR)(默認(rèn))

  • 二進(jìn)制文件記錄的是日志的邏輯 SQL 語(yǔ)句。
  • 優(yōu)點(diǎn):不需要記錄每一條 SQL 語(yǔ)句與每行的數(shù)據(jù)變化,這樣子 binlog 的日志也會(huì)比較少,減少了磁盤(pán)IO,提高性能。
  • 缺點(diǎn):在某些情況下會(huì)導(dǎo)致 master-slave 中的數(shù)據(jù)不一致。

ROW,基于行復(fù)制(row-based replication, RBR)

  • 不只是記錄簡(jiǎn)單的 SQL 語(yǔ)句,而是記錄表的更改情況。
  • 優(yōu)點(diǎn):只需要記錄被修改的

Mixed,混合模式復(fù)制(mixed-based replication, MBR)

三、redo log 與 binlog 的區(qū)別

表4 redo log 與 binlog 的區(qū)別

區(qū)別redo logbinlog
所處位置不同InnoDB 引擎特有MySQL 的 server 層實(shí)現(xiàn)的,所有的引擎都可以使用
記錄內(nèi)容不同記錄關(guān)于每個(gè)頁(yè)的更改物理情況,即該日志是物理日志記錄一個(gè)事務(wù)的具體操作內(nèi)容,即該日志是邏輯日志
寫(xiě)入方式不同空間固定會(huì)用完,循環(huán)寫(xiě)入不會(huì)覆蓋以前的日志,追加寫(xiě)入
寫(xiě)入時(shí)間不同在事務(wù)進(jìn)行過(guò)程中,不斷有重做日志條目(redo entry)被寫(xiě)入重做日志文件中僅在事務(wù)提交前進(jìn)行提交,即只寫(xiě)磁盤(pán)一次,不論這時(shí)該事務(wù)多大
  • redo log 是物理日志,記錄的是“在某個(gè)數(shù)據(jù)頁(yè)上做了什么修改”;
  • binlog 是邏輯日志,記錄的是這個(gè)語(yǔ)句的原始邏輯,比如“給ID=2這一行的c字段加1 ”。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談MySQL數(shù)據(jù)庫(kù)中日期中包含零值的問(wèn)題

    淺談MySQL數(shù)據(jù)庫(kù)中日期中包含零值的問(wèn)題

    下面小編就為大家?guī)?lái)一篇淺談MySQL數(shù)據(jù)庫(kù)中日期中包含零值的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • 安全地關(guān)閉MySQL服務(wù)的教程

    安全地關(guān)閉MySQL服務(wù)的教程

    這篇文章主要介紹了安全地關(guān)閉MySQL服務(wù)的教程,包括使用kill指令時(shí)的一些注意點(diǎn),需要的朋友可以參考下
    2015-11-11
  • SQL字段拼接成新字段幾種常見(jiàn)的方法

    SQL字段拼接成新字段幾種常見(jiàn)的方法

    這篇文章主要給大家介紹了關(guān)于SQL字段拼接成新字段幾種常見(jiàn)的方法,如我們?cè)谶x擇商品的時(shí)候不止需要知道商品的名字,還需要商品代碼型號(hào)等,這個(gè)時(shí)候需要把這些字段拼接為一個(gè)字段進(jìn)行操作或者輸出,需要的朋友可以參考下
    2023-08-08
  • 在MySQL中分析平均響應(yīng)時(shí)間最長(zhǎng)的SQL的六種方法

    在MySQL中分析平均響應(yīng)時(shí)間最長(zhǎng)的SQL的六種方法

    這篇文章主要介紹了在MySQL中分析平均響應(yīng)時(shí)間最長(zhǎng)的SQL的六種方法,主要方法包括使用PerformanceSchema、SysSchema、慢查詢?nèi)罩?、詳?xì)性能分析、按模式分類、實(shí)時(shí)監(jiān)控和快照對(duì)比,推薦結(jié)合使用,需要的朋友可以參考下
    2025-10-10
  • Mysql中強(qiáng)制索引的具體使用

    Mysql中強(qiáng)制索引的具體使用

    Mysql強(qiáng)制索引可以通過(guò)強(qiáng)制使用某些列的索引來(lái)提高查詢的性能,本文就來(lái)介紹一下Mysql中強(qiáng)制索引的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • mysql中的多個(gè)字段最大最小值

    mysql中的多個(gè)字段最大最小值

    這篇文章主要介紹了mysql中的多個(gè)字段最大最小值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • SQL多表聯(lián)查的幾種方法示例總結(jié)

    SQL多表聯(lián)查的幾種方法示例總結(jié)

    本文詳細(xì)介紹了SQL中不同類型的連接操作,包括內(nèi)連接、左外連接、右外連接、全外連接、交叉連接、自連接及其排除內(nèi)連接的特殊應(yīng)用,每種連接類型都提供了語(yǔ)法說(shuō)明和具體示例,幫助理解如何在實(shí)際中應(yīng)用這些連接來(lái)處理和分析數(shù)據(jù),需要的朋友可以參考下
    2024-09-09
  • 最新評(píng)論

    长垣县| 德清县| 中牟县| 鄂托克前旗| 景德镇市| 通城县| 沁阳市| 和林格尔县| 莒南县| 库车县| 东阿县| 如皋市| 兰州市| 宜兴市| 西盟| 桂平市| 凉城县| 南澳县| 徐水县| 开化县| 托里县| 上杭县| 宣恩县| 桂东县| 水富县| 安徽省| 大丰市| 成都市| 铅山县| 佛冈县| 建瓯市| 沅陵县| 德庆县| 岳西县| 利辛县| 武陟县| 舟山市| 盖州市| 巴林左旗| 沁水县| 衡阳市|