innodb_flush_log_at_trx_commit = 1 是否比 innodb_flush_log_at_trx_commit = 2 對 SSD 的磨損更大?
我正在執行一個 Nextcloud 實例,當同步很多小文件時,我會遇到同步緩慢的問題。我發現這
innodb_flush_log_at_trx_commit = 1
是造成這種情況的原因,所以我被迫設置innodb_flush_log_at_trx_commit = 2
. 現在我正在考慮將我的數據庫移動到 SSD。我想確認我確實遇到了訪問時間問題。
innodb_flush_log_at_trx_commit
設置為時寫入磁碟的數據量是否與設置1
為時相同2
?
你剛問
當 innodb_flush_log_at_trx_commit 設置為 1 時寫入磁碟的數據量是否與設置為 2 相同?
答案是肯定的,因為存在瓶頸。這個瓶頸在哪裡?
請查看 InnoDB 架構(由 Percona 首席技術官 Vadim Tkachenko 提供)
請注意 InnoDB Memory Side 的右下角。這是日誌緩衝區。日誌資訊在哪裡刷新?查看 InnoDB 磁碟側的左下角。這是重做日誌。
為了提高 InnoDB 的寫入性能,請注意以下建議:
建議 #1
預設情況下,日誌緩衝區大小(大小為innodb_log_buffer_size)為
8M (8388608)
.請將innodb_log_buffer_size增加到
64M
.建議 #2
預設情況下,重做日誌(大小為innodb_log_file_size)為
48M (50331648)
.請將innodb_log_file_size增加到
1G
.如何實施
步驟 01:將這些選項添加到
/etc/my.cnf
(或my.ini
用於 Windows)[mysqld] innodb_log_file_size=1G innodb_log_buffer_size=64M
步驟02:登錄MySQL並執行
mysql> SET GLOBAL innodb_fast_shutdown = 0;
步驟 03:關閉 MySQL
service mysql stop
或以管理員身份從 Windows 命令行
C:\> net stop mysql
步驟 04:重命名重做日誌文件
mv ib_logfile0 ib_logfile0.bak mv ib_logfile1 ib_logfile1.bak
或以管理員身份從 Windows 命令行
rename ib_logfile0 ib_logfile0.bak rename ib_logfile1 ib_logfile1.bak
步驟 05:啟動 MySQL
service mysql start
或以管理員身份從 Windows 命令行
C:\> net start mysql
注意:此步驟可能需要 2-3 分鐘,因為它會創建兩個不同的日誌文件,每個文件 1G。
為什麼要更改這些設置?
當 SSD 對小型重做日誌執行隨機寫入時,磨損被本地化到磁碟的一部分。製作重做日誌會分散來自日誌緩衝區的寫入。使日誌緩衝區更大會降低寫入頻率,以換取要寫入的數據量增加。
如果整個 MySQL 實例位於 SSD 內,則必須進行這種調整,採用混合磁碟佈局(請參閱我的舊文章MySQL on SSD -有什麼缺點?)。
更多資訊
請閱讀有關優化 InnoDB 磁碟 I/O的 MySQL 文件以獲取更多 InnoDB 調整選項。