給從庫預熱innodb buffer pool

czxin788發表於2018-08-09

   最近在生產上做了一個 mysql 主從切換的操作,當從庫提升為主後,發現從庫一開始壓力異常大,分析原因應該是從庫的 innodb_buffer_pool 的熱資料沒有立即載入進來,導致發生大量磁碟讀了。我們的 innodb_buffer_pool 設定大小為 42G ,所以大約持續了 100 分鐘,才使得業務恢復正常。

 

   後來想想應該可以把主庫 innodb buffer pool 裡面的熱資料 dump 成磁碟檔案,然後把這個磁碟檔案複製到從庫,讓從庫從 dump 出的這個磁碟檔案把熱資料載入到從庫的 innodb buffer pool 裡面。於是我檢視 MySQL 官方文件,並找到了這樣的解決辦法。

 

具體步驟如下

1 )在主庫上,執行如下命令,把 innodb_buffer_pool_dump_pct 設定成 40% ,表示要把 innodb buffer pool 40% (根據情況也可以設定為 100% )的熱資料 dump 到磁碟檔案 /data/ib_buffer_pool 裡面:

mysql>SET GLOBAL innodb_buffer_pool_dump_pct=40;

2 )在主庫上,執行如下命令把 innodb buffer pool 裡面 40% 的熱資料 dump 到磁碟檔案 /data/ib_buffer_pool 裡面:

mysql> SET GLOBAL innodb_buffer_pool_dump_now=ON;


3 )在主庫上,執行如下命令顯示 dump 的進度,直至看到 completed 完成字樣為止:

mysql>SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';


4 )把主庫 /data/ib_buffer_pool 磁碟檔案複製到從庫的 /data 目錄下:


5 )在從庫上,執行如下命令,把 /data/ib_buffer_pool 裡面的熱資料載入到 innodb buffer pool

mysql>SET GLOBAL innodb_buffer_pool_load_now=ON;

6 在從庫上,執行如下命令顯示 load 的進度

mysql>SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

 

7 )在從庫上,執行如下命令,看從庫的 LRU LIST 裡面有多少個頁了:

mysql> select count(*) from information_schema.INNODB_BUFFER_PAGE_LRU ;

 

8 當看到從庫的 load 進度顯示完成字樣時,就可以進行主從切換的動作了,先把主庫關閉,並等待從庫應用完 relay log 後,把 vip 繫結到從庫上,從而完成了手工主從切換資料庫。切換後,從庫的執行效能和主庫一樣,對業務影響非常小。

 

 

參考文件:

https://dev.mysql.com/doc/refman/8.0/en/innodb-preload-buffer-pool.html


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-2199483/,如需轉載,請註明出處,否則將追究法律責任。

相關文章