mysql 的 sync_binlog = 0 的風險
我試圖了解
sync_binlog=0
MySQL 的風險。我們沒有從數據庫,而且,如果我們在發生災難性故障的情況下失去一兩秒(甚至一兩分鐘)的事務,那也不會是世界末日。在這種情況下,穿上它是否安全/更可取sync_binlog=0
?似乎它可以使性能/寫訪問大致翻倍,這似乎是一種勝利。我想我的問題是:如果在失敗的情況下你有
sync_binlog=0
,你能保證最壞的情況是幾秒鐘的數據失去嗎?或者,數據庫可能會被填充,您必須從備份中恢復?
https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html#sysvar_sync_binlog說:
sync_binlog=0
:禁用 MySQL 伺服器將二進制日誌同步到磁碟。相反,MySQL 伺服器依賴作業系統不時將二進制日誌刷新到磁碟,就像它對任何其他文件所做的那樣。此設置提供了最佳性能,但如果發生電源故障或作業系統崩潰,伺服器可能已送出尚未同步到二進制日誌的事務。當 MySQL 寫入二進制日誌時,它使用作業系統支持的緩衝 I/O 進行寫入。作業系統負責將 I/O 請求刷新到物理儲存。它通常會很快做到這一點。不能保證你會遇到最壞情況的災難。如果您的寫入速率相當適中,則作業系統可能會刷新緩衝 I/O 的速度幾乎與寫入發生的速度一樣快。因此,當崩潰發生時,所有掛起的寫入都已經被刷新,所以你什麼也不會失去。
但是,如果有大量的並發 I/O 活動競爭儲存設備,或者如果您的數據庫寫入是連續的且速率很高,則 I/O 緩衝區更有可能有大量內容等待刷新到磁碟。那是在崩潰中失去的部分。
如果您的系統在極少數情況下可以容忍一些數據失去,您可能會決定放寬持久性設置,例如
sync_binlog
. 這將有助於減少 COMMIT 事務時的成本。如果您沒有副本並且想要進一步減少成本,您可以考慮禁用二進制日誌。然後你不用擔心 using 的持久性
sync_binlog
,因為它根本不會進行寫入。但複製並不是二進制日誌的唯一目的。它可用於時間點恢復,或用於更改日誌流(使用 Debezium 之類的工具),或用於檢查更改歷史記錄(儘管審計日誌對此更好)。