<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          必須了解的MySQL三種日志

          共 2547字,需瀏覽 6分鐘

           ·

          2021-04-24 01:04

          前言

          大家有沒(méi)有想過(guò)為什么MySQL數(shù)據(jù)庫(kù)可以實(shí)現(xiàn)主從復(fù)制,實(shí)現(xiàn)持久化,實(shí)現(xiàn)回滾的呢?其實(shí)關(guān)鍵在于MySQL里的三種log,分別是:

          • binlog
          • redo log
          • undo log

          這三種log也是面試經(jīng)常會(huì)問(wèn)的問(wèn)題,下面我們一起來(lái)探討一下吧。

          一、binlog

          binlog應(yīng)該是日常中聽(tīng)的最多的關(guān)于mysql中的log。

          那么什么是binlog呢?

          binlog是用于記錄數(shù)據(jù)庫(kù)表結(jié)構(gòu)和表數(shù)據(jù)變更的二進(jìn)制日志,比如insert、update、delete、create、truncate等等操作,不會(huì)記錄select、show操作,因?yàn)闆](méi)有對(duì)數(shù)據(jù)本身發(fā)生變更。

          binlog文件長(zhǎng)什么樣子呢?

          使用mysqlbinlog命令可以查看。

          會(huì)記錄下每條變更的sql語(yǔ)句,還有執(zhí)行開(kāi)始時(shí)間,結(jié)束時(shí)間,事務(wù)id等等信息。

          如何查看binlog是否打開(kāi),如果沒(méi)打開(kāi)怎么設(shè)置?

          使用命令show variables like '%log_bin%';查看binlog是否打開(kāi)。

          如果像上圖一樣,沒(méi)有開(kāi)啟binlog,那怎么開(kāi)啟呢?

          找到my.cnf配置文件,增加下面配置(mysql版本5.7.31):

          # 打開(kāi)binlog
          log-bin=mysql-bin
          # 選擇ROW(行)模式
          binlog-format=ROW

          修改后,重啟mysql,配置生效。

          執(zhí)行SHOW MASTER STATUS;可以查看當(dāng)前寫(xiě)入的binlog文件名。

          binlog用來(lái)干嘛的呢?

          第一,用于主從復(fù)制。一般在公司中做一主二從的結(jié)構(gòu)時(shí),就需要master節(jié)點(diǎn)打開(kāi)binlog日志,從機(jī)訂閱binlog日志的信息,因?yàn)閎inlog日志記錄了數(shù)據(jù)庫(kù)數(shù)據(jù)的變更,所以當(dāng)master發(fā)生數(shù)據(jù)變更時(shí),從機(jī)也能隨著master節(jié)點(diǎn)的數(shù)據(jù)變更而變更,做到主從復(fù)制的效果。

          第二,用于數(shù)據(jù)恢復(fù)。因?yàn)閎inlog記錄了數(shù)據(jù)庫(kù)的變更,所以可以用于數(shù)據(jù)恢復(fù)。我們看到上面圖中有個(gè)字段叫Position,這個(gè)參數(shù)是用于記錄binlog日志的指針。當(dāng)我們需要恢復(fù)數(shù)據(jù)時(shí),只要指定--start-position和--stop-position,或者指定--start-datetime和--stop-datetime,那么就可以恢復(fù)指定區(qū)間的數(shù)據(jù)。

          二、redo log

          假設(shè)有一條update語(yǔ)句:

          UPDATE `user` SET `name`='劉德華' WHERE `id`='1';

          我們想象一下mysql修改數(shù)據(jù)的步驟,肯定是先把id='1'的數(shù)據(jù)查出來(lái),然后修改名稱為'劉德華'。再深層一點(diǎn),mysql是使用頁(yè)作為存儲(chǔ)結(jié)構(gòu),所以MySQL會(huì)先把這條記錄所在的頁(yè)加載到內(nèi)存中,然后對(duì)記錄進(jìn)行修改。但是我們都知道m(xù)ysql支持持久化,最終數(shù)據(jù)都是存在于磁盤(pán)中。

          假設(shè)需要修改的數(shù)據(jù)加載到內(nèi)存中,并且修改成功了,但是還沒(méi)來(lái)得及刷到磁盤(pán)中,這時(shí)數(shù)據(jù)庫(kù)宕機(jī)了,那么這次修改成功后的數(shù)據(jù)就丟失了。

          為了避免出現(xiàn)這種問(wèn)題,MySQL引入了redo log。

          如圖所示,當(dāng)執(zhí)行數(shù)據(jù)變更操作時(shí),首先把數(shù)據(jù)也加載到內(nèi)存中,然后在內(nèi)存中進(jìn)行更新,更新完成后寫(xiě)入到redo log buffer中,然后由redo log buffer在寫(xiě)入到redo log file中。

          redo log file記錄著xxx頁(yè)做了xxx修改,所以即使mysql發(fā)生宕機(jī),也可以通過(guò)redo log進(jìn)行數(shù)據(jù)恢復(fù),也就是說(shuō)在內(nèi)存中更新成功后,即使沒(méi)有刷新到磁盤(pán)中,但也不會(huì)因?yàn)殄礄C(jī)而導(dǎo)致數(shù)據(jù)丟失。

          redo log與事務(wù)機(jī)制是如何配合工作的?

          如圖所示:

          第1-3步驟就是把數(shù)據(jù)變更,然后寫(xiě)入到內(nèi)存中。

          第4步記錄到redo log中,然后把記錄置為prepare(準(zhǔn)備)狀態(tài)。

          第5,6步提交事務(wù),提交事務(wù)之后,第7步把記錄狀態(tài)改成commit(提交)狀態(tài)。

          保證了事務(wù)與redo log的一致性。

          binlog和redo log都可以數(shù)據(jù)恢復(fù),有什么區(qū)別?

          redo log是恢復(fù)在內(nèi)存更新后,還沒(méi)來(lái)得及刷到磁盤(pán)的數(shù)據(jù)。

          binlog是存儲(chǔ)所有數(shù)據(jù)變更的情況,理論上只要記錄在binlog上的數(shù)據(jù),都可以恢復(fù)。

          舉個(gè)例子,假如不小心整個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)被刪除了,能使用redo log文件恢復(fù)數(shù)據(jù)嗎

          不可以使用redo log文件恢復(fù),只能使用binlog文件恢復(fù)。因?yàn)閞edo log文件不會(huì)存儲(chǔ)歷史所有的數(shù)據(jù)的變更,當(dāng)內(nèi)存數(shù)據(jù)刷新到磁盤(pán)中,redo log的數(shù)據(jù)就失效了,也就是redo log文件內(nèi)容是會(huì)被覆蓋的。

          binlog又是在什么時(shí)候記錄的呢?

          答,在提交事務(wù)的時(shí)候。

          三、undo log

          undo log的作用主要用于回滾,mysql數(shù)據(jù)庫(kù)的事務(wù)的原子性就是通過(guò)undo log實(shí)現(xiàn)的。我們都知道原子性是指對(duì)數(shù)據(jù)庫(kù)的一系列操作,要么全部成功,要么全部失敗。

          undo log主要存儲(chǔ)的是數(shù)據(jù)的邏輯變化日志,比如說(shuō)我們要insert一條數(shù)據(jù),那么undo log就會(huì)生成一條對(duì)應(yīng)的delete日志。簡(jiǎn)單點(diǎn)說(shuō),undo log記錄的是數(shù)據(jù)修改之前的數(shù)據(jù),因?yàn)樾枰С只貪L。

          那么當(dāng)需要回滾時(shí),只需要利用undo log的日志就可以恢復(fù)到修改前的數(shù)據(jù)。

          undo log另一個(gè)作用是實(shí)現(xiàn)多版本控制(MVCC),undo記錄中包含了記錄更改前的鏡像,如果更改數(shù)據(jù)的事務(wù)未提交,對(duì)于隔離級(jí)別大于等于read commit的事務(wù)而言,不應(yīng)該返回更改后數(shù)據(jù),而應(yīng)該返回老版本的數(shù)據(jù)

          總結(jié)

          學(xué)完之后,我們知道這三種日志在mysql中都有著重要的作用,再回顧一下:

          • binlog主要用于復(fù)制和數(shù)據(jù)恢復(fù)。
          • redo log用于恢復(fù)在內(nèi)存更新后,還沒(méi)來(lái)得及刷到磁盤(pán)的數(shù)據(jù)。
          • undo log用于實(shí)現(xiàn)回滾和多版本控制。

          最后說(shuō)一句(求關(guān)注,別白嫖我)

          如果這篇文章對(duì)您有所幫助,或者有所啟發(fā)的話,幫忙掃描下方二維碼關(guān)注一下,您的支持是我堅(jiān)持寫(xiě)作最大的動(dòng)力。求一鍵三連:點(diǎn)贊轉(zhuǎn)發(fā)在看

          瀏覽 40
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本黄色一级大片免费 | 四虎成人在线影院 | 少妇的呻吟声 | 免费性爱视频在线观看 | 免费成人视频久久 |