MySQL中的undo日志
概念介紹:
我們知道,MySQL中的redo日志記錄了事務(wù)的行為,在服務(wù)器宕機(jī)的時(shí)候,可以通過(guò)重做事務(wù)來(lái)達(dá)到恢復(fù)數(shù)據(jù)的目的,然而,有的時(shí)候,事務(wù)還有回滾的需求,也就是說(shuō),我們需要知道某條在變成當(dāng)前情況之前的樣子,這種情況下,undo日志就派上用場(chǎng)了。也就是說(shuō),undo日志是為了將數(shù)據(jù)恢復(fù)到修改之前的樣子,因此在對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改的時(shí)候,我們需要知道,這個(gè)過(guò)程中會(huì)產(chǎn)生redo日志和undo日志。
存儲(chǔ)位置:
我們還知道,redo日志一般情況下放在redo日志文件中,也就是常說(shuō)的ib_log中,而undo日志存放在數(shù)據(jù)庫(kù)內(nèi)部的一個(gè)"段"中,這個(gè)概念,我們?cè)?月21號(hào)的文章中有講過(guò),忘記的同學(xué)可以回去看看,undo日志的段位于共享表空間內(nèi)。
回滾操作:
現(xiàn)在,我們已經(jīng)知道了undo的概念,其實(shí)就是共享表空間中的一塊區(qū)域,它的主要作用是將事務(wù)恢復(fù)到執(zhí)行修改之前的樣子,但是,恢復(fù)的情況一般分為兩種,一種是邏輯恢復(fù),一種是物理恢復(fù),這里需要非常強(qiáng)調(diào)的是,undo的恢復(fù)是邏輯恢復(fù),也就是說(shuō),如果你插入了100w條數(shù)據(jù),導(dǎo)致innodb分配了一個(gè)新的數(shù)據(jù)頁(yè)來(lái)存儲(chǔ)這些數(shù)據(jù),那么在事務(wù)進(jìn)行回滾的時(shí)候,undo的功能并不是回收這個(gè)數(shù)據(jù)頁(yè),而是將這些insert的操作,改變成delete的操作從而執(zhí)行回滾。在這個(gè)過(guò)程中,共享表空間的大小并不會(huì)發(fā)生改變。除此之外,undo日志會(huì)將delete操作轉(zhuǎn)化為insert操作,update操作轉(zhuǎn)化為反向的update操作。
刪除方式:
還有一點(diǎn)需要注意,事務(wù)共享表空間中寫(xiě)入undo日志的過(guò)程同樣需要寫(xiě)入redo日志,事務(wù)一旦提交,也就意味著事務(wù)的持久性生效,那么undo日志則不被需要,但是innodb并不會(huì)把這個(gè)undo日志直接刪除,而是放在一個(gè)undo日志的鏈表中,到底什么時(shí)候刪除取決于mysql的purge線(xiàn)程,這樣做是為了避免其他的事務(wù)需要通過(guò)undo日志來(lái)得到這條記錄之前的版本。
空間分配:
在實(shí)際操作中,一個(gè)數(shù)據(jù)庫(kù)實(shí)例上可能會(huì)進(jìn)行很多事務(wù),如果我們?yōu)槊恳粋€(gè)事務(wù)都分配單獨(dú)的日志數(shù)據(jù)頁(yè)來(lái)保存undo將會(huì)非常的浪費(fèi)存儲(chǔ)空間,我們簡(jiǎn)單算一算,假設(shè)一個(gè)應(yīng)用的TPS為1000,為每個(gè)事務(wù)分配一個(gè)undo頁(yè),我們之后到一個(gè)數(shù)據(jù)頁(yè)的大小是16kb,1分鐘將會(huì)產(chǎn)生60*1000個(gè)數(shù)據(jù)頁(yè),那么一分鐘大約需要的空間就是960M的磁盤(pán)空間,這樣顯然是不合理的,因此,在innodb中,對(duì)于undo頁(yè)可以進(jìn)行重用,具體的方法是,事務(wù)提交的時(shí)候,現(xiàn)將undo頁(yè)放入鏈表中,然后判斷這個(gè)undo頁(yè)的使用空間是否小于75%,如果是的話(huà),那么這個(gè)undo頁(yè)就可以被重用,之后的undo日志就可以追加在當(dāng)前undo日志的后面。當(dāng)然,我們可以通過(guò)show engine innodb status來(lái)查看鏈表中undo log 的數(shù)量,這里不做演示了。
以上就是MySQL中的undo日志的詳細(xì)內(nèi)容,更多關(guān)于MySQL undo日志的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- MySQL系列之redo log、undo log和binlog詳解
- 詳解MySQL 重做日志(redo log)與回滾日志(undo logo)
- mysql中的7種日志小結(jié)
- MySQL使用binlog日志做數(shù)據(jù)恢復(fù)的實(shí)現(xiàn)
- MySQL 一則慢日志監(jiān)控誤報(bào)的問(wèn)題分析與解決
- MySQL慢查詢(xún)?nèi)罩镜淖饔煤烷_(kāi)啟
- MySQL 慢查詢(xún)?nèi)罩镜拈_(kāi)啟與配置
- 詳解監(jiān)聽(tīng)MySQL的binlog日志工具分析:Canal
- MySQL Aborted connection告警日志的分析
- MYSQL SERVER收縮日志文件實(shí)現(xiàn)方法
- MySQL 撤銷(xiāo)日志與重做日志(Undo Log與Redo Log)相關(guān)總結(jié)
相關(guān)文章
Mysql系列SQL查詢(xún)語(yǔ)句書(shū)寫(xiě)順序及執(zhí)行順序詳解
這篇文章主要為大家介紹了Mysql系列SQL查詢(xún)語(yǔ)句的書(shū)寫(xiě)順序及執(zhí)行順序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10淺談一下MyISAM和InnoDB存儲(chǔ)引擎的區(qū)別
這篇文章主要介紹了MyISAM和InnoDB存儲(chǔ)引擎的區(qū)別,存儲(chǔ)引擎是MySQL中特有的一個(gè)術(shù)語(yǔ),其它數(shù)據(jù)庫(kù)中沒(méi)有,實(shí)際上存儲(chǔ)引擎是一個(gè)表存儲(chǔ)/組織數(shù)據(jù)的方式,今天就跟小編來(lái)看看MyISAM和InnoDB存儲(chǔ)引擎的區(qū)別,需要的朋友可以參考下2023-04-04MySQL數(shù)據(jù)庫(kù)主從復(fù)制延時(shí)超長(zhǎng)的解決方法
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)主從復(fù)制延時(shí)超長(zhǎng)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06解決Mysql數(shù)據(jù)庫(kù)插入數(shù)據(jù)出現(xiàn)問(wèn)號(hào)(?)的解決辦法
這篇文章主要介紹了解決Mysql數(shù)據(jù)庫(kù)插入數(shù)據(jù)出現(xiàn)問(wèn)號(hào)(?)的解決辦法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07通過(guò)yum方式安裝mySql數(shù)據(jù)庫(kù)的全過(guò)程
當(dāng)工作需要部署mysql時(shí),通過(guò)手動(dòng)上傳安裝包以及依賴(lài)包的方式安裝mysql會(huì)比較麻煩,可以添加官方y(tǒng)um源,來(lái)實(shí)現(xiàn)自動(dòng)安裝依賴(lài),方便快捷,下面這篇文章主要給大家介紹了關(guān)于通過(guò)yum方式安裝mySql數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2022-07-07windows 64位下mysql 8.0.13 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了windows 64位下mysql 8.0.13 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11