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

MySQL中的三大日志用法及分析

 更新時間:2025年05月17日 09:47:37   作者:拔劍縱狂歌  
這篇文章主要介紹了MySQL中的三大日志用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

MySQL中三大日志用法

  • undolog日志是inndb存儲引擎層生成的日志,實現(xiàn)了事務(wù)的原子性,主要用于事務(wù)回滾和MVCC。
  • redolog日志是inndb存儲引擎層生成的日志,實現(xiàn)了事務(wù)的持久性,主要用于掉電等故障恢復(fù)。
  • binlog日志是Server層生成的日志,主要用于數(shù)據(jù)備份和主從復(fù)制。

undolog回滾日志

undolog是如何實現(xiàn)事務(wù)回滾和MVCC?

三個隱藏字段:事務(wù)id、回滾指針、主鍵(如果我們在表中沒有指定主鍵,則會創(chuàng)建一個默認的隱藏主鍵row_id,如果表中有主鍵,則不會創(chuàng)建)。

在我們開啟事務(wù)后,執(zhí)行事務(wù)的過程中,如果我們對數(shù)據(jù)進行增刪改操作,會先記錄undolog日志,記錄數(shù)據(jù)變更之前的信息,然后更新數(shù)據(jù)庫中的記錄,并且記錄本次操作的事務(wù)ID、回滾指針。通過回滾指針,我們可以構(gòu)建出每條記錄的版本鏈,即數(shù)據(jù)庫中每一條記錄的歷史版本信息。

通過構(gòu)建的版本鏈,如果我們在執(zhí)行事務(wù)的過程中發(fā)生了異常,這時候就會根據(jù)版本鏈的信息將每條記錄中回滾到舊值。

MVCC的實現(xiàn)是利用版本鏈和開啟ReadView快照讀時記錄的信息,根據(jù)一定的規(guī)則去判斷修改記錄的事務(wù)是否已經(jīng)提交。如果提交了,在讀已提交的隔離級別下就可以讀取到已提交事務(wù)的信息了;如果在可重復(fù)讀隔離級別下,則會在后續(xù)的ReadView中復(fù)用之前的視圖,只能看到第一次創(chuàng)建ReadView時候的數(shù)據(jù)信息。

redolog重做日志

為什么需要redolog,解決了什么問題?

我們做數(shù)據(jù)的增刪改操作時,并不是直接將數(shù)據(jù)寫入到磁盤中,而是先將數(shù)據(jù)寫入到Buffer Pool緩存中。如果我們每次將數(shù)據(jù)都寫入到磁盤,將會導(dǎo)致磁盤I/O頻繁,內(nèi)存開銷大。

有了Buffer Pool之后,我們的具體操作流程為:

  • 讀取數(shù)據(jù)時,如果數(shù)據(jù)存在于Buffer Pool中,客戶端直接讀取Buffer Pool中的數(shù)據(jù),否則再去磁盤中讀取。
  • 當修改數(shù)據(jù)時,如果數(shù)據(jù)存在于Buffer Pool當中,那直接修改Buffer Pool所在的頁,然后將其頁設(shè)置為臟頁(該頁內(nèi)存數(shù)據(jù)和磁盤數(shù)據(jù)已經(jīng)不一致了),為了減少磁盤I/O,不會立即將臟頁寫入到磁盤,后續(xù)由后臺線程在一個合適的時機將臟頁寫入磁盤。

引入Buffer Pool做數(shù)據(jù)緩存解決了頻繁讀寫I/O的問題,但是又導(dǎo)致了緩存中的數(shù)據(jù)和磁盤中的數(shù)據(jù)存在不一致的問題。即我們更新完緩存中的數(shù)據(jù),這時候還沒來得及更新磁盤中的數(shù)據(jù),mysql發(fā)生故障,導(dǎo)致緩存中的數(shù)據(jù)丟失,數(shù)據(jù)持久化失敗。

為了解決這個問題,MySQL在Innodb存儲引擎層引入了redolog日志。這時候,當有一條數(shù)據(jù)更新的時候,InnoDB引擎就會先更新內(nèi)存(同時標記為臟頁),然后將本次對這個頁的修改以redo log的形式記錄下來,這時候更新就算完成了。后續(xù)InnoDB存儲引擎會在后臺啟動一個線程,將redolog中的記錄寫入到磁盤中,并將binlog中已經(jīng)寫入磁盤的內(nèi)容清空,這時候更新操作最終完成。

有的同學(xué)可能會有疑問?我將更新的操作寫入到redolog中也是做磁盤的IO操作,為什么不直接將數(shù)據(jù)寫入到數(shù)據(jù)庫中呢?先寫入到redolog中,再寫入到數(shù)據(jù)庫中不是更加浪費開銷嗎?

要解答這個問題,首先我們需要先了解一下常見的兩種寫入磁盤的方式:

  • 順序?qū)懭?/strong>:我們向磁盤中寫入數(shù)據(jù)遵循一定的規(guī)則,比如從頭到尾。
  • 隨機寫入:我們向磁盤中寫入數(shù)據(jù)是隨機的,一會寫到這里,一會寫到那里。

打個比方:就像我們寫作業(yè)一樣,順序?qū)懭胧菑牡谝豁搶懙阶詈笠豁摚欢S機寫入則是我們一會寫到第一頁,一會寫到第五頁。我們進行順序?qū)懭胧遣僮鞅入S機寫入的操作要快很多,這也是MySQL為什么引入redolog的另一個目的。

redolog的兩大作用:

  • 將臟頁數(shù)據(jù)保存下來,實現(xiàn)事務(wù)的持久化。
  • 提高讀寫效率,將MySQL的隨機寫入轉(zhuǎn)變?yōu)轫樞驅(qū)懭搿?/li>

什么時候持久化:

  • 后臺的進程會每隔一秒將redolog中的日志寫入到磁盤中。
  • 即使目前事務(wù)還沒有提交,如果沒有提交,會在mysql異常重啟之后進行回滾操作。

binlog記錄日志

我們前面介紹的undolog和redolog都是InnDB存儲引擎層生成的日志。

MySQL在完成一條更新操作后,Server層還會生成一條binlog,等之后事務(wù)提交的時候,會將該事務(wù)執(zhí)行過程中產(chǎn)生的所有binlog統(tǒng)一寫入binlog文件。

binlog文件記錄了所有的數(shù)據(jù)庫表結(jié)構(gòu)變更和表數(shù)據(jù)修改的日志,不會記錄查詢類的操作,比如SELECT、SHOW操作。

為什么要有binlog日志,binlog和redolog的區(qū)別是什么?

我們先來談一談為什么要有binlog日志?

如果我們的數(shù)據(jù)庫是因為磁盤故障或者損壞引起的,這時候可能發(fā)生數(shù)據(jù)丟失。在這種情況下,數(shù)據(jù)庫可能無法正常啟動或者無法讀取先前持久化的數(shù)據(jù)。如果數(shù)據(jù)庫中存儲了重要的數(shù)據(jù),必須進行恢復(fù),這時候通過undolog和redolog都是沒有辦法恢復(fù)的。undolog記錄的是當前事務(wù)的執(zhí)行語句的相反操作,只能用于事務(wù)的回滾。redolog僅僅記錄的是內(nèi)存中已經(jīng)更改的數(shù)據(jù)但是磁盤上未進行更改的數(shù)據(jù),隨著redolog刷盤條件的達成,redolog中的記錄會刪除,也就是說,通過redolog只能夠恢復(fù)部分數(shù)據(jù),僅為redolog記錄的僅僅是一定范圍內(nèi)的數(shù)據(jù),有限。

這時候,我們就想,如果能夠一個日志系統(tǒng),能夠?qū)?shù)據(jù)庫的所有DML語句都記錄下來,并且不斷地堆積,那該多好?。∵@就是MySQL中binlog的作用,用于做數(shù)據(jù)備份和數(shù)據(jù)的恢復(fù)。

除了數(shù)據(jù)備份和恢復(fù)外,binlog還用于實現(xiàn)主從復(fù)制。因為binlog中記錄的所有DML語句,如果想要在另一個服務(wù)器上復(fù)制這一個表,只需要將binlog文件在想要復(fù)制的服務(wù)器上重新執(zhí)行一遍即可。

binlog只有在事務(wù)提交的時候,才會將binlog日志持久化到本地。

總結(jié)

MySQL當中的三大日志,作用不同,互為補充,提高了數(shù)據(jù)存儲的安全性和一致性。

其中,undolog和redolog用于實現(xiàn)InnoDB存儲引擎中事務(wù)四大特性的原子性和持久性,保證小范圍內(nèi)的數(shù)據(jù)一致性。binlog用于實現(xiàn)數(shù)據(jù)庫的全量備份,為數(shù)據(jù)恢復(fù)提供了一種重要的方式,值得注意的是,如果我們想要通過binlog恢復(fù)數(shù)據(jù)庫中的所有信息,就需要定期的進行數(shù)據(jù)備份。因為 mysql僅會保證一定數(shù)量的數(shù)據(jù)文件,如果超過了該數(shù)量會將舊值刪除。

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

相關(guān)文章

  • Ubuntu系統(tǒng)安裝mysql超詳細步驟

    Ubuntu系統(tǒng)安裝mysql超詳細步驟

    這篇文章主要給大家介紹了關(guān)于Ubuntu系統(tǒng)安裝mysql的相關(guān)資料,現(xiàn)在的軟件越來越好安裝,尤其是在ubuntu下安裝軟件,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • mysql數(shù)據(jù)庫重置表主鍵id的實現(xiàn)

    mysql數(shù)據(jù)庫重置表主鍵id的實現(xiàn)

    在我們的開發(fā)過程中,難免在做測試的時候會生成一些雜亂無章的SQL主鍵數(shù)據(jù),本文主要介紹了mysql數(shù)據(jù)庫重置表主鍵id的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • MySQL存儲IP地址的三種方法

    MySQL存儲IP地址的三種方法

    在MySQL中,存儲IP地址通常有幾種推薦的方法,每種方法都有其優(yōu)缺點,可以根據(jù)具體需求選擇合適的方式,本文給大家介紹了MySQL存儲IP地址的三種方法:使用VARCHAR類型,使用INT類型存儲IPv4和使用BINARY(16)或VARBINARY(16)存儲IPv6,需要的朋友可以參考下
    2024-07-07
  • MySQL執(zhí)行SQL文件的常見場景與方法

    MySQL執(zhí)行SQL文件的常見場景與方法

    MySQL?作為世界上最流行的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在日常開發(fā)和運維工作中扮演著重要角色,本文主要介紹了MySQL?執(zhí)行?SQL?文件的主要方法與場景,希望對大家有所幫助
    2025-06-06
  • Linux下徹底卸載mysql詳解

    Linux下徹底卸載mysql詳解

    如何在Linux下徹底的卸載MySQL數(shù)據(jù)庫呢? 下面這篇文章就給大家總結(jié)、整理了一下在Linux平臺下徹底卸載MySQL的方法。 文中通過圖文及示例代碼介紹的很詳細,相信對大家的理解和學(xué)習很有幫助,下面有需要的朋友們來一起學(xué)習學(xué)習吧。
    2016-11-11
  • mysql_connect(): Connection using old (pre-4.1.1) authentication protocol refused

    mysql_connect(): Connection using old (pre-4.1.1) authentica

    MySQL錯誤提示:Connection using old (pre-4.1.1) authentication protocol refused (client option ‘secure_auth’ enabled)解決辦法,需要的朋友可以參考下
    2014-04-04
  • 理解MySQL存儲過程和函數(shù)

    理解MySQL存儲過程和函數(shù)

    這篇文章主要幫助大家學(xué)習理解MySQL存儲過程和函數(shù),感興趣的小伙伴們可以參考一下
    2016-03-03
  • 淺談為什么MySQL不推薦使用子查詢和join

    淺談為什么MySQL不推薦使用子查詢和join

    這篇文章主要介紹了淺談為什么MySQL不推薦使用子查詢和join,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2021-03-03
  • MySQL讀取my.cnf的順序問題詳情

    MySQL讀取my.cnf的順序問題詳情

    這篇文章主要介紹MySQL讀取my.cnf的順序問題,以mysql.server、mysqld_safe及mysqld和my_print_defaults讀取my.cnf順序展開文章介紹主題,感興趣的話大家一起來學(xué)習吧
    2021-09-09
  • MySQL如何配置my.ini文件

    MySQL如何配置my.ini文件

    文章介紹了如何修改my.ini文件以解決數(shù)據(jù)庫忘記密碼或其他基礎(chǔ)問題,首先,需要停止數(shù)據(jù)庫服務(wù),然后創(chuàng)建并編輯my.ini文件,設(shè)置數(shù)據(jù)庫字符集、緩沖池大小等參數(shù),接著,刪除舊的data文件夾并重新生成,配置my.ini文件時要注意命名規(guī)范
    2025-01-01

最新評論

合作市| 内丘县| 固阳县| 澎湖县| 偃师市| 教育| 宣恩县| 景洪市| 闻喜县| 招远市| 庆城县| 景宁| 吉林省| 垦利县| 赫章县| 定边县| 龙胜| 日土县| 宜兰市| 客服| 东光县| 依兰县| 侯马市| 崇文区| 会泽县| 清远市| 永修县| 涞水县| 民勤县| 绵竹市| 山东省| 靖宇县| 格尔木市| 哈巴河县| 二连浩特市| 荣昌县| 什邡市| 河北区| 垫江县| 伊吾县| 调兵山市|