MySQL Checkpoint機制

來源:互聯網
上載者:User

標籤:ar   使用   sp   strong   檔案   資料   on   問題   log   

checkpoint乾的事情:

    將緩衝池中的髒頁重新整理回磁碟,不同之處在於每次從哪裡取多少髒頁重新整理到磁碟,以及什麼時候觸發checkpoint。

checkpoint解決的問題:
    1.縮短資料庫的恢復(資料庫宕機時,不需要重做所有的日誌,因checkpoint之前的頁都已經重新整理回磁碟啦)
    2.緩衝池不夠用時,將髒頁重新整理到磁碟(緩衝池不夠用時,根據LRU算會溢出最近最少使用的頁,若此頁為髒頁,需要強制執行checkpoint將髒也刷回磁碟)
    3.重做日誌不可用時,重新整理髒頁(採用迴圈使用的,並不是無限增大。當重用時,此時的重做日誌還需要使用,就必須強制執行checkpoint將髒頁刷回磁碟)

checkpoint分類:
1.Sharp Checkpoint
    發生在資料庫關閉時將所有的髒頁刷回磁碟,這是預設的。通過參數innodb_fast_shutdown=1來設定。
2.Fuzzy Checkpoint
    在InnoDB儲存引擎內部使用Fuzzy Checkpoint進行頁的重新整理,即只重新整理一部分髒頁,而不是全部重新整理。大致分為以下幾種情況:
        a.Master Thread Checkpoint
            差不多以每秒或者每十秒從緩衝池的髒頁列表(Flush列表),這是非同步作業,InnoDB儲存引擎可以進行其他的操作部分不會發生堵塞。
        b.FLUSH_LUR_LIST Checkpoint
            InnoDB儲存引擎需要保證LRU列表中有差不多100個空閑頁可供使用。在InnoDB1.1.X版本之前,需要檢查LRU列表中是否有足夠的可用空間操作發生在使用者查詢線程中,顯然這會阻塞使用者的查詢操作。倘若沒有100個空閑頁,那麼InnoDB儲存引擎會將LRU列表尾端的頁移除,如果這些頁中有髒頁,那麼需要進行Checkpoint,而這些來自於LRU列表的被稱為FLUSH_LRU_LIST Checkpoint。但是在MySQL5.6版本後這個檢查被放在了一個單獨的Page Cleaner Thread中進行,通過參數innodb_lru_scan_depth來設定可用頁的數量。
        c.Async/Sync Flush Checkpoint
            在重做記錄檔停用情況下,需要將一些也重新整理回磁碟,而操作發生在Flush列表上。若將已經寫入到重做日誌的LSN記為redo_lsn,將已經重新整理回磁碟最新的LSN記為checkpoint_lsn,則可以定義:checkpoint_age = redo_lsn-checkpoint_lsn在定義一下的變數async_water_mark=75%*total_redo_log_file_size、sync_water_mark=90%*total_redo_file_size。若每個重做日誌的大小為1G且定義了兩個重做日誌共2G。那麼async_water_mark=1.5G,sync_water_mark=1.8G。
                當checkpoint_age<async_water_mark時,不需要重新整理任何髒資料到磁碟;
                當async_water_mark<checkpoint_age<sync_water_mark時,觸發Async Flush從Flush列表重新整理足夠的髒頁會磁碟,使得重新整理後滿足checkpoint_age<async_water_mark;
                當checkpoint_age>sync_water_mark時,這種情況很少發生除非設定的重做記錄檔太小,並且進行類似於LOAD DATA的BULK INSRET操作。這個時候觸發Sync Flush從Flush列表重新整理足夠的髒頁會磁碟,使得重新整理後滿足checkpoint_age<async_water_mark;
            Async Flush Checkpoint會阻塞發現問題的使用者查詢線程,Sync Flush Checkpoint會阻塞所有的使用者查詢線程,並且等待髒頁重新整理完成。但是從MySQL5.6版本開始這部分操作放入單獨的Page Cleaner Thread中,不再會堵塞使用者查詢線程。
        d.Dirty Page too much Checkpoint
            髒頁的數量太多導致InnoDB儲存引擎強制進行Checkpoint,其目的是為了保證緩衝池中有足夠的頁可以用。可以通過參數innodb_max_dirty_pages_pct來設定。

    注意:Checkpoint機制將髒頁刷回磁碟並不是直接刷回磁碟的,而是通過doublewrite(兩次寫). 即通過memcpy函數將髒頁先複製到記憶體中的doublewrite buffer,之後通過doublewrite分兩次(每次1MB)順序寫入共用資料表空間的物理磁碟上,然後調用fsync函數同步磁碟。具體是怎麼實現的會在以後的部落格中分享。

MySQL Checkpoint機制

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.