天天看點

[InnoDB系列] - InnoDB Buffer Pool儲存和還原更新檔

作/譯者:葉金榮(Email:

[InnoDB系列] - InnoDB Buffer Pool儲存和還原更新檔

),來源:http://imysql.cn,轉載請注明作/譯者和出處,并且不能用于商業用途,違者必究。

參考文章:Making MySQL more usable: InnoDB save/restore buffer pool patch。

Jeremy Cole同學寫了個更新檔,用于将InnoDB 緩沖池(buffer pool)裡的清單在關閉mysqld時儲存到本地檔案中,重新開機啟動時再加載到記憶體中去。該更新檔目前隻适用于MySQL 5.1版本。作者計劃該更新檔至少應具備以下幾點要求:

可以自定義本地檔案名

可以在啟動時自主選擇是否需要加載到記憶體中

支援在接受使用者請求前先加載一部分,剩下的可以放到背景程序中繼續加載

不過,作者目前隻是想到了以下幾點特性,雖然有的還沒有實作:

采用多線程來加載,這對于使用RAID陣列更有優勢

支援線上儲存/還原緩沖池,而無需重新開機mysqld

增加緩沖池的統計資訊,便于在加載時能選擇哪些優先級别比較高,避免所有的頁都以同一優先級加載

下面我們來嘗試用以下這個更新檔,看看效果如何。

1、準備

下載下傳innodb plugin 1.0.1,下載下傳更新檔buffer_pool_save_restore.patch 和 move_buf_chunk_struct.patch。下載下傳MySQL 5.1.26源碼。

然後是解壓縮,打更新檔,編譯。

可以看到,已經将該更新檔編譯進去了。在這裡,也可以下載下傳 percona 提供的源碼,裡面已經內建了其他的幾個更新檔。

2、測試

首先,模拟各種方法,将innodb buffer pool盡量填滿,最快的辦法就是導出全部資料。設定 innodb_buffer_pool_size 大小為 14G,然後導出全部資料,可以看到全部被填滿了:

關閉mysqld,檢視一下是不是産生了本地檔案。

然後啟動mysqld,可以看到日志中記錄了大量類似下面的内容:

然後,再看看buffer pool的情況:

可以看到,幾乎填滿了所有buffer pool,相當于還原到了重新開機前的記憶體狀态,省去了需要經過一段時間運作才能使記憶體填滿所需緩沖的過程,實在是友善。不過,它也有一個緻命的缺點,那就是如果你的buffer pool較大(測試時最高用到14G),則啟動可能會非常慢,有時候甚至無法忍受。我的測試伺服器配置應該說還算不錯了(dell 2950, 16Gb ram, MD3000盤陣),然而上面的測試中,啟動mysqld居然花了幾乎7個小時才完成,根本無法忍受。

把buffer pool大小調成6G,還是執行上面的測試,發現啟動時間立刻縮小了很多,隻需要 <b>2min53s</b>。

<b>注意:</b>不建議在非常重要的系統中使用該更新檔,萬一出了問題,沒人為你負責 :)

附:下面是我的一些測試資料

第一列是表示 ib_buf_pool_state 檔案中有多少行資料。另外,可以通過 head/tail/grep 等工具來自主選擇需要被重新加載的buffer内容。

本文出自 “MySQL中文網”部落格 http://www.imysql.cn/

繼續閱讀