0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MySQL三種日志講解

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2023-07-25 11:15 ? 次閱讀

前言

MySQL 日志包含了錯(cuò)誤日志、查詢?nèi)罩?、慢查詢?nèi)罩尽⑹聞?wù)日志、二進(jìn)制日志等,如果存儲(chǔ)引擎使用的是 InnoDB ,二進(jìn)制日志(binlog)和事務(wù)日志(包括redo log和undo log) 是肯定繞不過(guò)去的,本篇接下來(lái)詳細(xì)為大家介紹這三種日志。

redo log

為什么要有 redo log ?

我們都清楚,事務(wù)的四大特性其中有一個(gè)是持久性,簡(jiǎn)單的說(shuō)就是只要事務(wù)提交成功,對(duì)數(shù)據(jù)庫(kù)做的修改就會(huì)被永久保存下來(lái),不會(huì)因?yàn)槿魏卧蛟倩氐皆瓉?lái)的狀態(tài)。

MySQL 是怎么樣保證持久性的呢?最簡(jiǎn)單的做法是在每次事務(wù)提交的時(shí)候,將該事務(wù)涉及修改的數(shù)據(jù)頁(yè)全部刷新回磁盤(pán)中,可是這么做存在嚴(yán)重的性能問(wèn)題:

單個(gè)事務(wù)可能涉及修改多個(gè)數(shù)據(jù)頁(yè),并且數(shù)據(jù)頁(yè)在物理上并不連續(xù),使用隨機(jī)IO寫(xiě)入性能太差。

Innodb是以頁(yè)為單位進(jìn)行磁盤(pán)交互的,一個(gè)事務(wù)有可能只會(huì)修改一個(gè)數(shù)據(jù)頁(yè)中的幾個(gè)字節(jié),如果這時(shí)候?qū)⑼暾臄?shù)據(jù)頁(yè)刷回磁盤(pán)的話,很浪費(fèi)資源。

因此 MySQL 設(shè)計(jì)出了redo log,當(dāng)一條記錄更新的時(shí)候, InnoDB 引擎會(huì)先把記錄寫(xiě)到 redo log 里面去,同時(shí)更新內(nèi)存,這樣就算這條數(shù)據(jù)更新成功了,完美地解決了性能問(wèn)題(文件更小并且是順序IO)。

注意此時(shí)數(shù)據(jù)并沒(méi)有更新到磁盤(pán)上,InnoDB 會(huì)在恰當(dāng)?shù)臅r(shí)候把這條記錄更新到磁盤(pán)上去。這種先寫(xiě)日志然后再將數(shù)據(jù)刷盤(pán)的機(jī)制,有個(gè)專有名詞——WAL(Write-ahead logging)。

redo log 如何刷到磁盤(pán)的呢?

redo log包含兩部分:

內(nèi)存中的日志緩沖(redo log buffer)

磁盤(pán)上的日志文件(redo log file)

每執(zhí)行一條DML語(yǔ)句,數(shù)據(jù)庫(kù)先將記錄寫(xiě)入redo log buffer,然后后續(xù)某個(gè)時(shí)間點(diǎn)再一次性將多個(gè)操作記錄寫(xiě)到redo log file。MySQL 一共支持三種寫(xiě)入redo log file的時(shí)機(jī),通過(guò)參數(shù)innodb_flush_log_at_trx_commit進(jìn)行配置,如下圖所示:

11a928f4-29ff-11ee-a368-dac502259ad0.png

bin log

bin log 是 MySQL 的邏輯日志,由Server層進(jìn)行記錄,用于記錄數(shù)據(jù)庫(kù)執(zhí)行的寫(xiě)入性操作(不包括查詢)信息,以二進(jìn)制的形式保存在磁盤(pán)中。無(wú)論你使用的是任何的存儲(chǔ)引擎,mysql數(shù)據(jù)庫(kù)都會(huì)記錄binlog日志。

與redo log日志一樣,binlog也有自己的刷盤(pán)策略,通過(guò)sync_binlog參數(shù)控制:

0 :每次提交事務(wù)前將binlog寫(xiě)入os cache,由操作系統(tǒng)控制什么時(shí)候刷到磁盤(pán)

1 :采用同步寫(xiě)磁盤(pán)的方式來(lái)寫(xiě)binlog,不使用os cache來(lái)寫(xiě)binlog

N :當(dāng)每進(jìn)行n次事務(wù)提交之后,調(diào)用一次fsync() os cache中的binlog強(qiáng)制刷到磁盤(pán)

bin log 和 redo log 都用于記錄的修改之后的值,那么它們之間究竟有什么區(qū)別呢?

redo log 和 binlog 的區(qū)別

主要有以下三方面:

binlog 是 MySQL 的 Server 層實(shí)現(xiàn)的,所有的引擎都是可以的。redo log是InnoDB的日志。如果不使用InnoDB引擎,是沒(méi)有redo log的。

binlog是邏輯日志,記錄的是對(duì)哪一個(gè)表的哪一行做了什么修改;redo log是物理日志,記錄的是對(duì)哪個(gè)數(shù)據(jù)頁(yè)中的哪個(gè)記錄做了什么修改,可以理解為對(duì)磁盤(pán)上的哪個(gè)數(shù)據(jù)做了修改。

redo log 是有固定大小的,所以它的空間會(huì)用完,如果用完的話,一定要進(jìn)行一些寫(xiě)入磁盤(pán)的操作才可以繼續(xù); binlog 是可以追加寫(xiě)入的,也就是 binlog 沒(méi)有空間的概念,一直寫(xiě)就行了

undo log

數(shù)據(jù)庫(kù)事務(wù)四大特性中有一個(gè)是原子性,原子性指對(duì)數(shù)據(jù)庫(kù)的一系列操作,要么全部成功,要么全部失敗,不可能出現(xiàn)部分成功的情況。實(shí)際上,原子性底層就是通過(guò)undo log實(shí)現(xiàn)的。

undo log主要記錄了數(shù)據(jù)的邏輯變化,比如一條UPDATE語(yǔ)句,對(duì)應(yīng)一條相反UPDATE的undo log,一條INSERT語(yǔ)句,對(duì)應(yīng)一條DELETE的undo log,這樣在發(fā)生錯(cuò)誤時(shí),就能回滾到事務(wù)之前的數(shù)據(jù)狀態(tài)。

undo log 同時(shí)也是MVCC(多版本并發(fā)控制)實(shí)現(xiàn)的關(guān)鍵。

總結(jié)

redo log是InnoDB存儲(chǔ)引擎的一種日志,主要作用是崩潰恢復(fù),刷盤(pán)策略參數(shù) innodb_flush_log_at_trx_commit 推薦設(shè)置成2。

binlog是MySQL Server層的一種日志,主要作用是歸檔。

undo log是InnoDB存儲(chǔ)引擎的一種日志,主要作用是回滾。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 磁盤(pán)
    +關(guān)注

    關(guān)注

    1

    文章

    361

    瀏覽量

    25154
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    797

    瀏覽量

    26399
  • 日志
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    10626
  • binlog
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    1243

原文標(biāo)題:還分不清bin log 、redo log 跟 undo log?

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    三種電源轉(zhuǎn)換器電路設(shè)計(jì)講解

      本文主要介紹了3.3V→5V電平轉(zhuǎn)換器、模擬增益電路和模擬補(bǔ)償電路三種電源轉(zhuǎn)換器的設(shè)計(jì)原理圖,對(duì)電路圖進(jìn)行簡(jiǎn)單的講解?! ?.3V→5V電平轉(zhuǎn)換器可以直接構(gòu)成電平轉(zhuǎn)換,往往是采用集成方案。有
    發(fā)表于 09-30 16:26

    MySQL的六個(gè)日志類型

    MySQL日志管理
    發(fā)表于 04-24 16:57

    STM32的三種boot模式介紹

    淺識(shí)STM32的三種boot模式文章目錄淺識(shí)STM32的三種boot模式任務(wù)摘要一、認(rèn)識(shí)boot1.三種BOOT模式介紹2.開(kāi)發(fā)BOOT模式選擇3.STM32三種啟動(dòng)模式4.
    發(fā)表于 12-10 07:46

    半導(dǎo)體極管的三種基本放大電路的三種連接法電路圖

    半導(dǎo)體極管的三種基本放大電路的三種連接法電路圖
    發(fā)表于 05-06 14:55 ?5570次閱讀
    半導(dǎo)體<b class='flag-5'>三</b>極管的<b class='flag-5'>三種</b>基本放大電路的<b class='flag-5'>三種</b>連接法電路圖

    三種不同的“防 Ping”技巧

    三種不同的“防 Ping”技巧 淺析三種不同的“防 Ping”方法   眾所周知,Ping命令是一個(gè)非常有用的網(wǎng)絡(luò)命令,大家常用它
    發(fā)表于 04-14 13:53 ?1117次閱讀

    晶體管放大電路的三種方法

    模擬電子技術(shù)中晶體管放大電路的方法有三種,PPT簡(jiǎn)單講解
    發(fā)表于 03-24 14:34 ?0次下載

    jdbc注冊(cè)驅(qū)動(dòng)的三種方式

    本文主要介紹了關(guān)于jdbc注冊(cè)驅(qū)動(dòng)的三種方式。jdbc中注冊(cè)驅(qū)動(dòng),首先導(dǎo)入對(duì)應(yīng)的包,例如mysql-connector-java-5.0.8-bin.jar。驅(qū)動(dòng)包是java和具體數(shù)據(jù)庫(kù)之間的連接
    的頭像 發(fā)表于 02-06 11:04 ?5925次閱讀
    jdbc注冊(cè)驅(qū)動(dòng)的<b class='flag-5'>三種</b>方式

    詳談MySQL數(shù)據(jù)庫(kù)的不同日志和源碼

    任何一數(shù)據(jù)庫(kù),都會(huì)擁有各種各樣的日志,mysql也不例外。
    的頭像 發(fā)表于 07-02 16:52 ?2550次閱讀

    MySQL事務(wù)日志

    大家都清楚,日志MySQL 數(shù)據(jù)庫(kù)的重要組成部分,記錄著數(shù)據(jù)庫(kù)運(yùn)行期間各種狀態(tài)信息。MySQL 日志主要包括「錯(cuò)誤日志」、「查詢
    的頭像 發(fā)表于 11-14 09:58 ?1695次閱讀
    <b class='flag-5'>MySQL</b>事務(wù)<b class='flag-5'>日志</b>

    80C51的三種復(fù)位技術(shù)講解資料下載

    電子發(fā)燒友網(wǎng)為你提供80C51的三種復(fù)位技術(shù)講解資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-08 08:46 ?9次下載
    80C51的<b class='flag-5'>三種</b>復(fù)位技術(shù)<b class='flag-5'>講解</b>資料下載

    詳解MySQL日志的作用

    MySQL日志 主要包括錯(cuò)誤日志、查詢日志、慢查詢日志、事務(wù)日志、二進(jìn)制
    的頭像 發(fā)表于 07-22 14:44 ?1302次閱讀

    基于mysql自有方式采集獲取監(jiān)控?cái)?shù)據(jù)

    我們常聽(tīng) MySQL 中有二進(jìn)制日志 binlog、中繼日志 relaylog、重做回滾日志 redolog、undolog 等。針對(duì)慢查詢,還有一
    發(fā)表于 12-30 10:56 ?389次閱讀

    如何優(yōu)化MySQL中的join語(yǔ)句

    mysql中,join 主要有Nested Loop、Hash Join、Merge Join 這三種方式,我們今天來(lái)看一下最普遍 Nested Loop 循環(huán)連接方式,主要包括三種
    的頭像 發(fā)表于 04-24 17:03 ?774次閱讀
    如何優(yōu)化<b class='flag-5'>MySQL</b>中的join語(yǔ)句

    mysql主從復(fù)制三種模式

    MySQL主從復(fù)制是一常見(jiàn)的數(shù)據(jù)同步方式,它可以實(shí)現(xiàn)將一個(gè)數(shù)據(jù)庫(kù)的更改同步到其他多個(gè)數(shù)據(jù)庫(kù)的功能。主從復(fù)制可以提高數(shù)據(jù)庫(kù)的可用性和性能,以及提供故障恢復(fù)和數(shù)據(jù)備份的支持。在MySQL中,有
    的頭像 發(fā)表于 11-16 14:04 ?1407次閱讀

    systemd journal收集日志三種方式

    隨著 systemd 成了主流的 init 系統(tǒng),systemd 的功能也在不斷的增加,比如對(duì)系統(tǒng)日志的管理。Systemd 設(shè)計(jì)的日志系統(tǒng)好處多多,這里筆者就不再贅述了,本文筆者主要介紹 systemd journal 收集日志
    的頭像 發(fā)表于 10-23 11:50 ?118次閱讀
    systemd journal收集<b class='flag-5'>日志</b>的<b class='flag-5'>三種</b>方式