何處理資料恢復 資料丟失 面試tx的架構師的崗位問的

HelloWorld-Q發表於2020-12-18

mysql對於資料恢復與資料丟失的處理:

  1. 儲存引擎層面:innodb儲存主要是由innodb_flush_log_at_trx_commit引數控制事務寫入資料到磁碟,不同值有不同的情況:
    0 :每秒 寫入快取與磁碟
    1 :每次commit都寫入快取與磁碟
    2 :每次commit都 寫入快取,然後根據innodb_flush_log_at_timeout(預設為1s)時間寫入磁碟

  2. 主從複製:
    主從複製實現主要是依靠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 協議》,轉載必須註明作者和本文連結
有夢想的人睡不著,沒有夢想的人睡不醒。

相關文章