介紹之前先介紹一下下面一條sql的執(zhí)行過程
update table set a=a+1 where id=1;
具體執(zhí) 流程:
調(diào)用存儲引擎接 ,找到id=1這 條記錄。如果數(shù)據(jù)在內(nèi)存中直接返回,否則先從磁盤中讀到內(nèi)存,然后返回
執(zhí)行器+1,
數(shù)據(jù)寫入內(nèi)存,同時記錄redo log
執(zhí)行器寫入binlog,寫入磁盤
redo log 更新為commit。

redo log 總結(jié)
? 當數(shù)據(jù)庫對數(shù)據(jù)做修改的時候,需要把數(shù)據(jù)頁從磁盤讀到buffer pool中,然后在buffer pool中進行修改,那么這個時候buffer pool中的數(shù)據(jù)頁就與磁盤上的數(shù)據(jù)頁內(nèi)容不一致,稱buffer pool的數(shù)據(jù)頁為dirty page 臟數(shù)據(jù),如果這個時候發(fā)生非正常的DB服務(wù)重啟,那么這些數(shù)據(jù)還沒在內(nèi)存,并沒有同步到磁盤文件中(注意,同步到磁盤文件是個隨機IO),也就是會發(fā)生數(shù)據(jù)丟失,如果這個時候,能夠在有一個文件,當buffer pool 中的data page變更結(jié)束后,把相應(yīng)修改記錄記錄到這個文件(注意,記錄日志是順序IO),那么當DB服務(wù)發(fā)生crash的情況,恢復(fù)DB的時候,也可以根據(jù)這個文件的記錄內(nèi)容,重新應(yīng)用到磁盤文件,數(shù)據(jù)保持一致。
? 這個文件就是redo log ,用于記錄 數(shù)據(jù)修改后的記錄,順序記錄。
undo log 總結(jié)
undo日志用于存放數(shù)據(jù)修改被修改前的值,假設(shè)修改 tba 表中 id=2的行數(shù)據(jù),把Name=’B’ 修改為Name = ‘B2’ ,那么undo日志就會用來存放Name=’B’的記錄,如果這個修改出現(xiàn)異常,可以使用undo日志來實現(xiàn)回滾操作,保證事務(wù)的一致性。