mysql-innodb 日誌機制分析----寫在死鎖前面
1、事務日誌介紹
參照mysql5.5的中文說明;
Innodb的事務日誌是指Redo log,簡稱Log,儲存在日誌檔案ib_logfile*裡面。Innodb還有另外一個日誌Undo log,但Undo log是存放在共享表空間裡面的(ibdata*檔案)。
由於Log和Checkpoint緊密相關,因此將這兩部分合在一起分析。
名詞解釋:LSN(log serial number),日誌序列號,Innodb的日誌序列號是一個64位的整型
1.1log的寫入機制:
LSN實際上對應日誌檔案的偏移量,新的LSN=舊的LSN + 寫入的日誌大小。舉例如下:
LSN=1G,日誌檔案大小總共為600M,本次寫入512位元組,則實際寫入操作為:
l 求出偏移量:由於LSN數值遠大於日誌檔案大小,因此透過取餘方式,得到偏移量為400M;
l 寫入日誌:找到偏移400M的位置,寫入512位元組日誌內容,下一個事務的LSN就是1000000512;
1.2Checkpoint寫入
Innodb實現了Fuzzy Checkpoint的機制,每次取到最老的髒頁,然後確保此髒頁對應的LSN之前的LSN都已經寫入日誌檔案,再將此髒頁的LSN作為Checkpoint點記錄到日誌檔案,意思就是“此LSN之前的LSN對應的日誌和資料都已經寫入磁碟檔案”。恢復資料檔案的時候,Innodb掃描日誌檔案,當發現LSN小於Checkpoint對應的LSN,就認為恢復已經完成。
Checkpoint寫入的位置在日誌檔案開頭固定的偏移量處,即每次寫Checkpoint都覆蓋之前的Checkpoint資訊。
1.3管理機制
由於Checkpoint和日誌緊密相關,將日誌和Checkpoint一起說明,詳細的實現機制如下
如上圖所示,Innodb的一條事務日誌共經歷4個階段:
l 建立階段:事務建立一條日誌;
l 日誌刷盤:日誌寫入到磁碟上的日誌檔案;
l 資料刷盤:日誌對應的髒頁資料寫入到磁碟上的資料檔案;
l 寫CKP:日誌被當作Checkpoint寫入日誌檔案;
對應這4個階段,系統記錄了4個日誌相關的資訊,用於其它各種處理使用:
l Log sequence number(LSN1):當前系統LSN最大值,新的事務日誌LSN將在此基礎上生成(LSN1+新日誌的大小);
l Log flushed up to(LSN2):當前已經寫入日誌檔案的LSN;
l Oldest modified data log(LSN3):當前最舊的髒頁資料對應的LSN,寫Checkpoint的時候直接將此LSN寫入到日誌檔案;
l Last checkpoint at(LSN4):當前已經寫入Checkpoint的LSN;
對於系統來說,以上4個LSN是遞減的,即: LSN1>=LSN2>=LSN3>=LSN4.建立日誌的LSN最大,寫入checkpoint的lsn是最小的;
show engine innodb status \G;
---
LOG
---
Log sequence number 16953660229
Log flushed up to 16953660229
Last checkpoint at 16953652205
1.4保護機制
Innodb的資料並不是實時寫盤的,為了避免當機時資料丟失,保證資料的ACID屬性,Innodb至少要保證資料對應的日誌不能丟失。對於不同的情況,Innodb採取不同的對策:
當機導致日誌丟失
Innodb有日誌刷盤機制,可以透過innodb_flush_log_at_trx_commit引數進行控制;
日誌覆蓋導致日誌丟失
Innodb日誌檔案大小是固定的,寫入的時候透過取餘來計算偏移量,這樣存在兩個LSN寫入到同一位置的可能,後面寫的把前面寫得就覆蓋了,以“寫入機制”章節的樣例為例,LSN=100000000和LSN=1600000000兩個日誌的偏移量是相同的了。這種情況下,為了保證資料一致性,必須要求LSN=1000000000對應的髒頁資料都已經刷到磁碟中,也就是要求Last checkpoint對應的LSN一定要大於1000000000,否則覆蓋後日志也沒有了,資料也沒有刷盤,一旦當機,資料就丟失了。
為了解決第二種情況導致資料丟失的問題,Innodb實現了一套日誌保護機制,詳細實現如下:
上圖中,直線代表日誌空間(Log cap,約等於日誌檔案總大小*0.8,0.8是一個安全係數),Ckp age和Buf age是兩個浮動的點,Buf async、Buf sync、Ckp async、Ckp sync是幾個固定的點。各個概念的含義如下:
當事務執行速度大於髒頁刷盤速度時,Ckp age和Buf age會逐步增長,當達到async點的時候,強制進行髒頁刷盤或者寫Checkpoint,如果這樣做還是趕不上事務執行的速度,則為了避免資料丟失,到達sync點的時候,會阻塞其它所有的事務,專門進行髒頁刷盤或者寫Checkpoint。
因此從理論上來說,只要事務執行速度大於髒頁刷盤速度,最終都會觸發日誌保護機制,進而將事務阻塞,導致MySQL操作掛起。
由於寫Checkpoint本身的操作相比寫髒頁要簡單,耗費時間也要少得多,且Ckp sync點在Buf sync點之後,因此絕大部分的阻塞都是阻塞在了Buf sync點,這也是當事務阻塞的時候,IO很高的原因,因為這個時候在不斷的刷髒頁資料到磁碟。例如如下截圖的日誌顯示了很多事務阻塞在了Buf sync點:
參考資料:linux公社謀篇文章
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30129545/viewspace-1427291/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL列印死鎖日誌MySql
- Mysql鎖機制分析MySql
- 寫在最前面
- 簡單介紹MySQL列印死鎖日誌的方法MySql
- 死鎖案例分析
- 玄機-第二章日誌分析-apache日誌分析Apache
- MySQL:一個死鎖分析 (未分析出來的死鎖)MySql
- 日誌分析-apache日誌分析Apache
- GreatSQL 死鎖案例分析SQL
- 寫在最前面的話
- 故障分析 | MySQL死鎖案例分析MySql
- SQLServer的死鎖分析(1):頁鎖SQLServer
- SQL SERVER死鎖查詢,死鎖分析,解鎖,查詢佔用SQLServer
- [日誌分析篇]-利用ELK分析jumpserver日誌-日誌拆分篇Server
- MySQL 死鎖問題分析MySql
- MySQL鎖等待與死鎖問題分析MySql
- 從自旋鎖、睡眠鎖、讀寫鎖到 Linux RCU 機制講解Linux
- MySQL批量更新死鎖案例分析MySql
- mysql 鎖的慢日誌MySql
- 【Linux入門教程】4 使用者管理、系統效能分析、系統日誌及日誌分析、訊號機制與訊號處理Linux
- 圖解Janusgraph系列-併發安全:鎖機制(本地鎖+分散式鎖)分析圖解分散式
- 故障分析 | 從一則錯誤日誌到 MySQL 認證機制與 bug 的深入分析MySql
- 解鎖Nginx日誌的寶藏:GoAccess——你的實時、互動式Web日誌分析神器!NginxGoWeb
- crash日誌分析
- FDOAGENT日誌分析
- MySQL死鎖系列-常見加鎖場景分析MySql
- Java併發程式設計之鎖機制之ReentrantReadWriteLock(讀寫鎖)Java程式設計
- zaq寫入日誌
- MySQL:RR分析死鎖一列MySql
- MySQL死鎖分析與解決之路MySql
- 如何利用NLog輸出結構化日誌,並在Kibana優雅分析日誌?
- 如何寫一段死鎖程式碼
- PHP 鎖機制PHP
- SQLite鎖機制SQLite
- 論加鎖否:程式日誌
- 在Linux中,有哪些日誌管理和分析工具?Linux
- perl分析apache日誌Apache
- JAVA GC日誌分析JavaGC
- Docker 容器日誌分析Docker