Mysql

禁用binlog時mysql伺服器大多停止工作

  • January 6, 2015

性能比我在 mysql 伺服器上想要的要慢一些,而且我們不使用複制,也不需要時間點恢復。因此,一種推薦的提高性能的方法似乎是關閉 bin-logging。我的 my.cnf 中有以下內容:

   ## Replication / Transaction Logging #
   binlog_format           = row
   log-bin                 = /var/lib/mysql/mysql-bin.log
   expire_logs_days        = 3
   sync-binlog             = 1

我註釋掉了所有四行並重新啟動了 mysql。該服務啟動良好,在任何錯誤日誌或慢查詢日誌中都沒有任何問題。一切看起來都很好,除了寫入性能減慢到無法使用的水平。它確實繼續工作。取消註釋以上四行並重新啟動服務立即恢復了以前的性能水平。

以前的性能水平不是我想要的,我想要關閉 bin-logging 帶來的性能改進。

為什麼會這樣?如何成功關閉 bin 日誌記錄以獲得性能?

眼鏡:

  • 所有表都是innodb(一些相當大)
  • mysql Ver 14.14 Distrib 5.6.19,用於使用 EditLine 包裝器的 debian-linux-gnu (x86_64)
  • Ubuntu 12.04 LTS 伺服器

同步二進制日誌

當您註釋掉時sync-binlog = 1,發生了什麼?

您將sync_binlog預設設置為 0。然後會發生什麼?MySQL 文件說:

sync_binlog 的預設值為 0,它不同步到磁碟——在這種情況下,伺服器依賴作業系統不時刷新二進制日誌的內容,就像任何其他文件一樣。

這意味著 mysqld 受作業系統的支配以將磁碟更改刷新到二進制日誌。這表明必須有很多文件打開(執行lsof)作業系統必須刷新到磁碟。MySQL 的目前二進制日誌必須處於需要定期刷新到磁碟的打開文件日誌堵塞的中間,尤其是在定期寫入大量這些打開文件的情況下。

MySQL 文件進一步說:

值 1 是最安全的選擇,因為在發生崩潰時,您最多會從二進制日誌中失去一個送出組。然而,它也是最慢的選擇(除非磁碟有電池支持的記憶體,這使得同步非常快)。

這僅僅意味著執行的刷新到磁碟sync-binlog=1為伺服器提供了一些穩定性,因為磁碟更改被刷新到磁碟並釋放了作業系統以更好地執行。沒有它,mysqld 與任何其他打開文件的程序(應用程序或作業系統)具有相同的優先級。

InnoDB

這是 InnoDB 的圖形表示(來自 Percona CTO Vadim Tkachenko)

InnoDB 管道

您可能希望強制 InnoDB 更積極地刷新到磁碟並且仍然表現良好。

  • 設置innodb_flush_methodO_DIRECT使 InnoDB 處理自己的磁碟更改刷新。給定圖片,InnoDB 將顯式刷新到系統表空間(ibdata1)中的雙寫緩衝區以及.ibd緩衝池中的表文件。在具有硬體 RAID 控制器和電池支持的寫入記憶體的系統上,O_DIRECT 可以幫助避免 InnoDB 緩衝池和作業系統的文件系統記憶體之間的雙重緩衝。
  • innodb_write_io_threads設置為 8(或 16)
  • innodb_log_buffer_size設置為 128M 以減少磁碟 I/O
  • innodb_log_file_size設置為 1G

因此,將這些設置添加到 my.cnf(需要重新啟動)

[mysqld]
innodb_flush_method = O_DIRECT
innodb_write_io_threads = 8
innodb_log_buffer_size = 128M
innodb_log_file_size = 1G

結語

如果你想禁用二進制日誌,調整 InnoDB 以通過補償更好地刷新

引用自:https://serverfault.com/questions/656505