一般在生產環境中,很少用MySQL單實例來支撐業務,大部分的MySQL應用都是採用搭建集群的方法。搭建MySQL集群,可以進行資料庫層面的讀寫分離、負載均衡或數據備份。基於MySQL原生的Replication是最常見的保證資料庫安全的機制,滿足資料庫的高可用,在資料庫發生宕機的情況後,其他節點還能 ...
一般在生產環境中,很少用MySQL單實例來支撐業務,大部分的MySQL應用都是採用搭建集群的方法。搭建MySQL集群,可以進行資料庫層面的讀寫分離、負載均衡或數據備份。基於MySQL原生的Replication是最常見的保證資料庫安全的機制,滿足資料庫的高可用,在資料庫發生宕機的情況後,其他節點還能快速提供服務,並且資料庫的數據不丟失。
Binlog是用來保存資料庫修改的日誌信息。一般的主從複製都是基於Binlog的,Binlog的安全直接關係到主從複製的安全,而Binlog的寫入方式主要由參數sync_binlog來控制。參數取值主要如下:
參數取值 | 影響的行為 |
sync_binlog=0 | 事務提交時,MySQL將Binlog信息寫入到Binlog文件(OS Cache)中,但是MySQL不控制Binlog的刷盤操作,由文件系統自己控制其緩存的刷新。缺點是,一旦操作系統宕機,在Binlog cache中的所有Binlog都會丟失。如果只是資料庫宕機,而操作系統不宕機,那麼資料庫所生成的Binlog都不會丟失。 |
sync_binlog=1 | 每一個事務提交時,MySQL都會把Binlog刷新到磁碟中,這樣,資料庫的安全性最高。缺點是,性能損耗是最大的。此設置可以保證,在資料庫或者操作系統宕機的情況下,二進位日誌中缺少的任何事務也只能處於準備階段,那麼導致伺服器自動恢復時,會回滾這些事務,保證無數據丟失。雖然Binlog是順序IO,但是多個事務同時提交,同樣會對MySQL和IO的性能帶來很大的影響,不過MySQL可以通過Group Commit來緩解這種壓力。 |
sync_binlog=N(N>1) | 表示每N次事務提交,MySQL調用文件系統的刷新操作將緩存刷新到磁碟中。如果資料庫或者操作系統在這個時候宕機,資料庫庫可能會丟失一些數據。 |
附:兩階段提交
MySQL在開始Binlog後,事務在提交時會自動被分成Prepare 和 Commit 兩個階段。
* Prepare 階段:告訴InnoDB引擎做Prepare,InnoDB更改事務狀態,並且Redo log刷入磁碟。
* Commit 階段:先記錄Binlog日誌,然後告訴InnoDB引擎Commit。
MySQL通過兩階段提交的方式保證宕機時數據的安全。
-----主要內容參考梳理於網路知識,此短文僅為學習筆記,在此原創作者感謝!