mysql對於資料恢復與資料丟失的處理:
儲存引擎層面:innodb儲存主要是由innodb_flush_log_at_trx_commit引數控制事務寫入資料到磁碟,不同值有不同的情況:
0 :每秒 寫入快取與磁碟
1 :每次commit都寫入快取與磁碟
2 :每次commit都 寫入快取,然後根據innodb_flush_log_at_timeout(預設為1s)時間寫入磁碟主從複製:
主從複製實現主要是依靠binlog日誌與中繼日誌,每次資料寫入binlog日誌是由引數sync_binlog所控制
= 0 :表示MySQL不控制binlog的重新整理,由檔案系統自己控制它的快取的重新整理0 :表示每sync_binlog次事務提交,MySQL呼叫檔案系統的重新整理操作將快取刷下去
其中最安全的就是sync_binlog設定為1,表示每次事務提交,MySQL都會把binlog快取刷下去,這樣在掉電等情況下,系統才有可能丟失1個事務的資料。同時對系統的IO消耗也是非常大的。
注意:如果innodb_flush_log_at_trx_commit沒有設定為1,仍會丟資料的。如果嚴格要求保證資料不丟失,必須設定redo log和binlog實時刷盤
binlog刷盤時機
對於InnoDB
儲存引擎而言,只有在事務提交時才會記錄biglog
,此時記錄還在記憶體中,那麼biglog
是什麼時候刷到磁碟中的呢?mysql
通過sync_binlog
引數控制biglog
的刷盤時機,取值範圍是0-N
:
- 0:不去強制要求,由系統自行判斷何時寫入磁碟;
- 1:每次
commit
的時候都要將binlog
寫入磁碟; - N:每N個事務,才會將
binlog
寫入磁碟。
從上面可以看出,sync_binlog
最安全的是設定是1
,這也是MySQL 5.7.7
之後版本的預設值。但是設定一個大一些的值可以提升資料庫效能,因此實際情況下也可以將值適當調大,犧牲一定的一致性來獲取更好的效能。
本作品採用《CC 協議》,轉載必須註明作者和本文連結