redo
在innodb存儲(chǔ)引擎中,事務(wù)日志通過重做(redo)日志文件和InnoDB存儲(chǔ)引擎的日志緩沖(InnoDB Log Buffer)來實(shí)現(xiàn)。當(dāng)開始一個(gè)事務(wù)時(shí),會(huì)記錄該事務(wù)的一個(gè)LSN(Log Sequence Number,日志序列號(hào));當(dāng)事務(wù)執(zhí)行時(shí),會(huì)往InnoDB存儲(chǔ)引擎的日志緩沖里插入事務(wù)日志;當(dāng)事務(wù)提交時(shí)必須將InnoDB存儲(chǔ)引擎的日志緩沖寫到磁盤(默認(rèn)的實(shí)現(xiàn),即innodb_flush_log_at_trx_commit=1)。也就是在寫數(shù)據(jù)前,需要先寫日志,這種方式稱為預(yù)寫日志方式(Write-Ahead Logging,WAL)。
InnoDB存儲(chǔ)引擎通過預(yù)寫日志的方式來保證事務(wù)的完整性。這意味著磁盤上存儲(chǔ)的數(shù)據(jù)頁和內(nèi)存緩沖池的頁是不同步的,對(duì)于內(nèi)存緩沖池中頁的修改,先是寫入重做日志文件,然后再寫入磁盤,因此是一種異步的方式。可以通過命令show engine innodb status來觀察當(dāng)前磁盤和日志的“差距”;
首先建立一張表z,然后建立一個(gè)往表z中導(dǎo)入數(shù)據(jù)的存儲(chǔ)過程load test。通過命令SHOW ENGINE INNODB STATUS觀察當(dāng)前的重做日志情況:
?
Log sequence number表示當(dāng)前的ISN, Log flushed up to表示刷新到重做日志文件的LSN, Last checkpoint at表示刷新到磁盤的LSN。因?yàn)楫?dāng)前沒有任何操作,所以這三者的值是一樣的。接著開始導(dǎo)入10000條記錄:
mysql>call?load test(10000);
mysql> show engine innodb status\G;
······
---
LOG
---
Log sequence number 11 3047672789
Log flushed up to 11 3047672789
Last checkpoint at 11 3047174608
0?pending log writes, 0?pending chkp writes
143?log i/o' s?done, 0.08?log i/o' s?second
······
1 row in set (0.00 sec)
?
這次SHOW ENGINE INNODB STATUS的結(jié)果就不同了, Log sequence number的LSN為113047672789, Log flushed up to的LSN為113047672789, Last checkpoint at的LSN為113047174608,可以把 Log flushed up to和 Last checkpoint at的差值498181(~486.5K)理解為重做日志產(chǎn)生的增量(以字節(jié)為單位)。
雖然在上面的例子中, Log sequence number和 Log flushed up to的值是相等的,但是在實(shí)際的生產(chǎn)環(huán)境中,該值有可能是不同的。因?yàn)樵谝粋€(gè)事務(wù)中從日志緩沖刷新到重做日志文件,并不只是在事務(wù)提交時(shí)發(fā)生,每秒都會(huì)有從日志緩沖刷新到重做日志文件的動(dòng)作(這部分內(nèi)容我們?cè)?/span>362小節(jié)已經(jīng)講解過了)。下面是一個(gè)生產(chǎn)環(huán)境下重做日志的信息:
mysql> show engine innodb status\G;
······
---
LOG
---
Log sequence number 203318213447
Log flushed up to 203318213326
Last checkpoint at 203252831194
1?pending log writes, 0 pending chkp writes
103447?log i/o' s done, 7.00?log i/o' s second
······
1 row in set (0.00 sec)
?
可以看到,在生產(chǎn)環(huán)境下Log sequence number、Log flushed up to、Last checkpoint at個(gè)值可能是不同的。
轉(zhuǎn)載于:https://www.cnblogs.com/5945yang/p/11061669.html
總結(jié)
- 上一篇: 数据与计算机通信复习重点
- 下一篇: Git最新版下载(安装包)——阿里镜像快