簡單描述一下mysql 檢查點,對mysql數據庫恢復的理解有所幫助。
數據庫版本
mysql> selectversion();+-----------+
| version() |
+-----------+
| 8.0.11 |
+-----------+
1 row in set (0.00 sec)
檢查點查看
mysql>show engine innodb status\G;---
LOG
---
Log sequence number 25048841
Log buffer assigned up to 25048841
Log buffer completed up to 25048841
Log written up to 25048841
Log flushed up to 25048841Added dirty pages upto 25048841Pages flushed upto 25048841Lastcheckpoint at 25048841
35 log i/o‘s done, 0.00 log i/o‘s/second----------------------
Last checkpoint就是檢查點的位置,在數據庫并不繁忙的時候,可以看到Log sequence number,Log flushed,Pages flushed的位置接近或相等。當數據庫DML操作較多時,它們的差值會變大。
相關參數
mysql數據庫將內存中臟頁刷新到磁盤時,記錄一次檢查點,也這是檢查點的功能,刷新內存臟頁到磁盤。innodb每秒或幾秒都會自動刷新臟頁,除此之外,它還受以下兩個參數影響
mysql> show variables like ‘%max_dirty_pages%‘;+--------------------------------+-----------+
| Variable_name | Value |
+--------------------------------+-----------+
| innodb_max_dirty_pages_pct | 50.000000 |
| innodb_max_dirty_pages_pct_lwm | 10.000000 |
+--------------------------------+-----------+
2 rows in set (0.00 sec)
當innodb臟頁使用率超過innodb_max_dirty_pages_pct_lwm的值時,除innodb本身的自動刷新臟頁機制外,會開始加速刷臟頁,當臟頁使用率超過innodb_max_dirty_pages_pct的值時,會再次提高刷新臟頁的速度。
innodb_max_dirty_pages_pct_lwm為0表示該參數不生效。
檢查點分類
Sharp Checkpoint(完全檢查點)
將內存中所有臟頁全部寫到磁盤就是完全檢查點,比如數據庫實例關閉時。
Fuzzy Checkpoint(模糊檢查點)
將部分臟頁刷新到磁盤,就是模糊檢查點,數據庫實例運行過程產生的檢查基本上就是這種類型的檢查點。
檢查點作用
主要作用就是減少數據恢復時間 。因為檢查點位置之前的數據都寫到磁盤上了,數據恢復便不需要再關注這部分數據,所以它減少了恢復的時間 。
常說的crash崩潰恢復,恢復的是哪些數據? 恢復的是Last checkpoint到Log flushedup之間的數據。Log flushedup是內存寫日志的位置,也是日志文件最新的位置。再新的話就到內存中去了,還沒有寫入日志文件的數據是沒法恢復的。