溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Mysql中有哪些日志

發(fā)布時間:2021-07-13 15:24:57 來源:億速云 閱讀:197 作者:Leah 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)Mysql中有哪些日志,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

redo log

        重做日志,是在binlog之上,一條update語句執(zhí)行時,首先會記錄一條redo log,然后再由執(zhí)行器生成binlog日志,redo log是InnoDB存儲引擎層的日志。
問題1.redo log 的意義
        首先redolog 在最開始的MySQL 存儲引擎MyISAM中是沒有的,后來由第三方公司開發(fā)的插件,也就是INNODB的前身,之后才有Innodb存儲引擎,所以redolog是innodb所特有的日志,他的目的是幫助mysql快速記錄變更的記錄,并且保持?jǐn)?shù)據(jù)一直性。所以在MYsql中每次更新和插入數(shù)據(jù)都需要進(jìn)行磁盤的存儲,這樣IO的成本太高,所以為了優(yōu)化mysql的實(shí)時需要刷盤的問題,Innodb采用了先寫日志,和更新緩存,然后在機(jī)器空閑的時候?qū)懭氪疟P,這樣就就有了redo日志。
問題2:redo 日志的好處?
        redo log可以防止mysql數(shù)據(jù)庫異常重啟時,可以快速恢復(fù)redo log中的數(shù)據(jù),將之前已經(jīng)提交的事務(wù)數(shù)據(jù)恢復(fù)到內(nèi)存中。這也就是mysql的crash-self能力。還有就是redo log相當(dāng)于一個緩存,先寫到緩存,然后再持久化到磁盤,速度相對比較快。
問題3:加入了redo log ,數(shù)據(jù)一致性如何保證?
         有了redo log,binlog寫入失敗怎么辦,所以這就設(shè)置到單機(jī)一致性問題,一般的我們知道XA協(xié)議,就是兩階段提交,在這里也是同樣的處理方式。下面有一個簡單update語句執(zhí)行的流程,我們就知道redo log和binlog的寫入時機(jī),和數(shù)據(jù)恢復(fù)問題。

 

binlog

binlog有三種格式:Statement、Row以及Mixed

–基于SQL語句的復(fù)制(statement-based replication,SBR),
–基于行的復(fù)制(row-based replication,RBR),
–混合模式復(fù)制(mixed-based replication,MBR)。


 

mysql innodb update 執(zhí)行流程

1.執(zhí)行器首先找數(shù)據(jù)引擎查詢需要操作的行,如果該數(shù)據(jù)所在的數(shù)據(jù)頁就在內(nèi)存中,則直接返回給執(zhí)行器,否則需要從磁盤中讀取數(shù)到內(nèi)存中,在返回。
2.執(zhí)行器將操作后待更新的數(shù)據(jù)調(diào)用執(zhí)行引擎寫入新的行數(shù)據(jù)
3.引擎先更新到內(nèi)存,同時將更新操作記錄到redo log,此時redo log 處于一個準(zhǔn)備階段,然后告訴執(zhí)行器,執(zhí)行完成,隨時可以提交事務(wù)
4.執(zhí)行器生成這個操作的binlog,并將binlog寫入磁盤
5.執(zhí)行器調(diào)用事務(wù)提交接口,引擎把剛剛寫入的redo log 狀態(tài)改成提交狀態(tài),整個更新操作就完成了。
從整個步驟可以看出,redo log 和binlog 在一次事務(wù)中是需要都成功才會保持一致性的。所謂的系統(tǒng)空閑的時候刷盤和binlog是兩回事,binlog是事務(wù)提交同步就要完成的事情。

 

undo log

        undo log有兩個作用:提供回滾和多個行版本控制(MVCC),還有為了實(shí)現(xiàn)事務(wù)的原子性。

        在數(shù)據(jù)修改的時候,不僅記錄了redo,還記錄了相對應(yīng)的undo,如果因?yàn)槟承┰驅(qū)е率聞?wù)失敗或回滾了,可以借助該undo進(jìn)行回滾。undo log和redo log記錄物理日志不一樣,它是邏輯日志。可以認(rèn)為當(dāng)delete一條記錄時,undo log中會記錄一條對應(yīng)的insert記錄,反之亦然,當(dāng)update一條記錄時,它記錄一條對應(yīng)相反的update記錄。當(dāng)執(zhí)行rollback時,就可以從undo log中的邏輯記錄讀取到相應(yīng)的內(nèi)容并進(jìn)行回滾。有時候應(yīng)用到行版本控制的時候,也是通過undo log來實(shí)現(xiàn)的:當(dāng)讀取的某一行被其他事務(wù)鎖定時,它可以從undo log中分析出該行記錄以前的數(shù)據(jù)是什么,從而提供該行版本信息,讓用戶實(shí)現(xiàn)非鎖定一致性讀取。undo log是采用段(segment)的方式來記錄的,每個undo操作在記錄的時候占用一個undo log segment。另外,undo log也會產(chǎn)生redo log,因?yàn)閡ndo log也要實(shí)現(xiàn)持久性保護(hù)。

 

innodb-relay.log

        relay logMySQL進(jìn)行主主復(fù)制或主從復(fù)制的時候才會出現(xiàn)的日志文件,他本質(zhì)復(fù)制的binlog,然后生成relay log,然后從節(jié)點(diǎn)基于該日志進(jìn)行數(shù)據(jù)備份。
   MySQL主從復(fù)制涉及到三個線程,一個運(yùn)行在主節(jié)點(diǎn)(log dump thread),其余兩個(I/O thread, SQL thread)運(yùn)行在從節(jié)點(diǎn)
       1.主線程binlog dump線程:當(dāng)從節(jié)點(diǎn)連接主節(jié)點(diǎn)時,主節(jié)點(diǎn)會創(chuàng)建一個log dump 線程,用于發(fā)送bin-log的內(nèi)容。在讀取bin-log中的操作時,此線程會對主節(jié)點(diǎn)上的bin-log加鎖,當(dāng)讀取完成,甚至在發(fā)動給從節(jié)點(diǎn)之前,鎖會被釋放。
       2.從節(jié)點(diǎn)IO線程:當(dāng)從節(jié)點(diǎn)上執(zhí)行start slave命令之后,從節(jié)點(diǎn)會創(chuàng)建一個I/O線程用來連接主節(jié)點(diǎn),請求主庫中更新的bin-log。I/O線程接收到主節(jié)點(diǎn)binlog dump 進(jìn)程發(fā)來的更新之后,保存在本地relay-log中。
       3.從節(jié)點(diǎn)SQL線程:SQL線程負(fù)責(zé)讀取relay log中的內(nèi)容,解析成具體的操作并執(zhí)行,最終保證主從數(shù)據(jù)的一致性。


關(guān)于Mysql中有哪些日志就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI