[MySQLFAQ]系列–資料不算大,備份卻非常慢

科技小先鋒發表於2017-11-28
環境

硬體:DELL 1950, 146G SAS 15K RPMS * 2, 8G Ram

軟體:2.6.9-55.ELsmp x86_64, mysql 5.1.x
現象

2個庫,其中1個業務庫下有20多個表,表檔案大小總量不到2G。

另一個為日誌庫,下400多個表,大致是每天會產生5個表,其中有一個表較大,約400MB,總量約40多GB。

每次備份耗時較長,最嚴重的一次花了5個多小時才完成。

業務庫為當前活動庫,日誌庫則主要用作備份,每天日誌歸檔,過期資料表很少有讀寫請求。
InnoDB Buffer Pool總共分配了2G,從系統命令 top 結果來看,mysqld 只分配了 1.7G 記憶體,buffer pool 並沒有全部耗盡。
SHOW ENGINE INNODB STATUS 結果中也看到了,buffer pool 確實沒用完,還有不少空閒的。

備份時,觀察 vmstat 結果,發現 bi 和 bo 的量較大,而且兩個的值基本相當,備份其中一個表約 500MB,耗時 46 秒。

按照這個耗時計算,全部備份出來也不需要5個多小時,這是為什麼呢?
分析

大家先分析下,看是什麼原因,稍後給出答案 ?
原因 其實問題原因很簡單,但一般人不容易想到。那就是,那些歷史的日誌表,由於長時間不讀取,大部分資料沒有在innodb buffer中。所以,每次備份時,大部分資料都要產生大量的物理讀,然後再產生物理寫,然而該伺服器只有2塊硬碟,I/O效能有限,所以備份非常慢。
這時候,我們可以有幾種解決辦法:

1. 刪除過期日誌表,或者放到線下的歸檔資料庫上

2. 如果innodb buffer還有大量空閒的話,可以不定期執行select * from table,將這部分資料load到buffer中,減少備份時的物理I/O,提高速度
本文轉自葉金榮51CTO部落格,原文連結:http://blog.51cto.com/imysql/308978,如需轉載請自行聯絡原作者


相關文章