elasticsearch入門系列">elasticsearch入門系列
635
2022-05-29
學(xué)習(xí)本博客之前需要儲(chǔ)備知識(shí):
Mysql體系架構(gòu)
InnoDB存儲(chǔ)引擎
MySQL事務(wù)知識(shí)
文章目錄
1、Undo Log
1.1、什么是Undo log?
1.2、Undo log存儲(chǔ)方式
1.3、Undo log的工作原理
1.4、Undo log相關(guān)的變量
1.5、Undo log作用說(shuō)明
附錄:參考資料
1、Undo Log
1.1、什么是Undo log?
Undo:意為撤銷或取消,undo即返回指定某個(gè)狀態(tài)的操作
Undo日志:undo log是mysql中兩種比較重要的事務(wù)日志,另外一種是redo log,undo log顧名思義,是一種用于撤銷回退的日志,用于事務(wù)沒(méi)提交之前,會(huì)先記錄存放到 Undo 日志文件里,當(dāng)事務(wù)回滾時(shí)或者數(shù)據(jù)庫(kù)崩潰時(shí),可以利用 Undo 日志回退事務(wù)
ps:undo log和redo log是InnoDB才支持的日志,是兩種比較重要的事務(wù)日志,在mysql存儲(chǔ)引擎中,InnoDB是支持事務(wù)的常用存儲(chǔ)引擎
1.2、Undo log存儲(chǔ)方式
Undo log的存儲(chǔ)由InnoDB存儲(chǔ)引擎實(shí)現(xiàn),數(shù)據(jù)保存在InnoDB的數(shù)據(jù)文件中,innodb存儲(chǔ)引擎對(duì)undo的管理采用段(segment)的方式,具體來(lái)說(shuō)是一種命名為回滾段(rollback segment)的數(shù)據(jù)結(jié)構(gòu)。
回滾段(rollback segment)中有1024個(gè)undo log segment,以前舊版本只支持1個(gè)rollback segment,也即只能存儲(chǔ)1024個(gè)undo log segment,MySQL5.5版本之后,能支持128個(gè)rollback segment,也即128*1024個(gè)undo log segment
1.3、Undo log的工作原理
undo log在事務(wù)開(kāi)啟之前就產(chǎn)生,當(dāng)事務(wù)提交的時(shí)候,不會(huì)刪除undo log,因?yàn)榭赡苄枰猺ollback操作,要執(zhí)行回滾(rollback)操作時(shí),從緩存中讀取數(shù)據(jù)。InnoDB會(huì)將事務(wù)對(duì)應(yīng)的日志保存在刪除list中,后臺(tái)通過(guò)purge線程進(jìn)行回收處理
ok,還是以一條sql執(zhí)行update、select過(guò)程,畫圖表示,圖例是自己所畫,圖例模仿網(wǎng)上課程ppt,如圖:
執(zhí)行update操作,事務(wù)A提交時(shí)候(事務(wù)還沒(méi)提交),會(huì)將數(shù)據(jù)進(jìn)行備份,備份到對(duì)應(yīng)的undo buffer,Undo Log保存了未提交之前的操作日志,User表數(shù)據(jù)肯定就是持久保存到InnoDB的數(shù)據(jù)文件IBD,默認(rèn)情況。
這時(shí)事務(wù)B進(jìn)行查詢操作,是直接讀undo buffer緩存的,這時(shí)事務(wù)A還沒(méi)提交事務(wù),要回滾(rollback),是不讀磁盤的,先直接從undo buffer緩存讀取
ps:undo日志屬于邏輯日志,redo是物理日志,所謂邏輯日志是undo log是記錄一個(gè)操作過(guò)程,不會(huì)物理刪除undo log,sql執(zhí)行delete或者update操作都會(huì)記錄一條undo日志
1.4、Undo log相關(guān)的變量
musql -u root -p,登錄mysql客戶端,查詢undo相關(guān)參數(shù):(基于Mysql8版本)
innodb_undo_directory:定義存儲(chǔ)的目錄路徑,默認(rèn)值./,表示datadir
datadir參數(shù)可以通過(guò)設(shè)置my.ini配置文件:
[mysql] # 設(shè)置mysql數(shù)據(jù)庫(kù)的數(shù)據(jù)的存放目錄 datadir="D:\mysql-8.0.13-winx64\data"
1
2
3
innodb_undo_log_truncate:參數(shù)設(shè)置為1,即開(kāi)啟在線回收(收縮)undo log日志文件,支持動(dòng)態(tài)設(shè)置,默認(rèn)是關(guān)閉的
innodb_undo_logs:這個(gè)參數(shù)是指前面介紹的rollback segment的數(shù)量,Mysql5.5版本之后默認(rèn)設(shè)置為128
innodb_undo_tablespaces:該變量默認(rèn)值為0,表示undo log全部寫入一個(gè)表空間文件,可以設(shè)置這個(gè)變量,平均分配到多少個(gè)文件中
1.5、Undo log作用說(shuō)明
實(shí)現(xiàn)事務(wù)的原子性
undo log可以用于實(shí)現(xiàn)事務(wù)的原子性, 如果事務(wù)處理過(guò)程出現(xiàn)一些特殊情況,比如sql錯(cuò)誤等等情況,就要執(zhí)行回滾(rollback)操作,mysql就可以利用undo log將數(shù)據(jù)恢復(fù)到事務(wù)開(kāi)始之前
實(shí)現(xiàn)多版本并發(fā)控制(MVCC)
Undo Log 在 MySQL InnoDB 存儲(chǔ)引擎中用來(lái)實(shí)現(xiàn)多版本并發(fā)控制,事務(wù)沒(méi)提交之前,undo日志可以作為高并發(fā)情況下,其它并發(fā)事務(wù)進(jìn)行快照讀
關(guān)于Redo log的可以參考我博客MySQL系列之事務(wù)日志redo log學(xué)習(xí)筆記
附錄:參考資料
https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html
MySQL SQL
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。