Mysql

非阻塞 MySQL 備份

  • August 21, 2017

我正在執行一個帶有幾個客戶數據庫的 MySQL 伺服器,其中一些非常大。我們每天進行一次完整的 mysql 轉儲。大約需要半個小時才能完成。

在此期間,對 MySQL 伺服器的每個請求都會得到非常慢的響應(有時大約 1 秒而不是 10 毫秒)。即使沒有超時錯誤,我希望看到查詢在相當長的時間內完成,因此客戶網站不會因掛起 MySQL 查詢而減慢速度。

我進行了很多研究並了解了數據複製、LVM 快照、各種mysqldump標誌選項和其他變通方法,但沒有什麼能真正改善這種情況。

是否有任何選項可以在 MySQL 中設置查詢優先級?

如果有辦法定義查詢優先級,我可以給備份程序一個較低的優先級,以確保所有其他查詢執行得更快。該mysqldump過程可能會SIGTSTP在受到另一個請求的挑戰時暫時暫停(),並SIGCONT在查詢完成時繼續()。但是,我在 MySQL 本機中找不到這樣的功能。

mysqldump程序一個更高的nice值是行不通的,因為它只會增加備份程序和表鎖存在的時間。(我正在鎖定每個表。)此外,限制 IO 寫入速率只會導致更長的痛苦。

除了 LVM 和複製之外,還有什麼我錯過的解決方案嗎?

事實上**,瓶頸是 IO**。由於我tar -czf用來壓縮文件並且 CPU 性能非常好,驅動器根本無法處理如此快速的所有數據(儘管我們使用鏡像 RAID 卷)。

mysqldump本身完全沒有問題,但是tar 卻大大拖慢了整個系統的速度。

我現在pv用來塑造管道流:

tar -czf - ./ | pv -q -L 10m > output.tgz
  • -q禁用pv.
  • -L 10m將寫入操作限制為每秒 10 MB。gzip只需通過查看過程來測試您應該在伺服器上使用哪個值top。我希望它有大約 50% 的 CPU 使用率,因此 IO 影響也降低到 50%。
  • CPU 影響被隱式降低,因為pv減慢了一切(除了轉儲本身,它是在壓縮之前完成的)。

非常感謝@Michael - sqlbot 和其他人將我推向了正確的方向。

引用自:https://dba.stackexchange.com/questions/148288