《一張思維導圖縱觀MySQL數據安全體系》要點:
本文介紹了一張思維導圖縱觀MySQL數據安全體系,希望對您有用。如果有疑問,可以聯系我們。
作者介紹 :
楊奇龍,前阿里數據庫團隊資深DBA,主要負責淘寶業務線,經歷多次雙十一,有海量業務訪問DB架構設計經驗.目前就職于有贊科技,負責數據庫運維工作,熟悉MySQL性能優化、故障診斷、性能壓測.
和團隊內部的同事一起溝通,討論了MySQL數據庫系統數據安全性問題,主要針對MySQL丟數據 、主從不一致的場景 ,還有業務層面使用不得當導致主備庫數據結構不一樣的情況,本文是基于以上的討論和總結做的思維導圖.
(1)redo log
innodb_flush_log_at_timeout
< 5.6.6: 每隔一秒將redo log buffer中的數據刷新到磁盤
>= 5.6.6:每隔innodb_flush_log_at_timeout秒將數據刷新到磁盤中去
(2)binlog
sync_binlog? =1
(3)innodb buffer data
不同的flush mathod刷數據的圖形展示.圖片來自hatemysql.com.
(4)InnoDB 落盤
MySQL數據落盤的路徑,圖片來自李春hatemysql.com.
常見的雙寫
(1)slave_skip_counter 不合理
slave_skip_counter =1
slave_skip_counter >1
(2)DB Crash,OS正常
innodb_flush_log_at_trx_commit=0
事務提交時,不刷新緩存,系統刷新的頻率是1s,故會丟失1s的數據.
innodb_flush_log_at_trx_commit=1
事務提交時,會刷新到磁盤,保證事務落盤,故不丟數據.
innodb_flush_log_at_trx_commit=2
事務提交時,刷新到os cache,系統沒有crash,數據無丟失.
(3)DB正常,OS Crash
帶有 BBU
innodb_flush_log_at_trx_commit=0
事務提交時,不刷新緩存,系統刷新的頻率是1s,故會丟失1s的數據.
innodb_flush_log_at_trx_commit=1
事務提交時,會刷新到磁盤,保證事務落盤,故不丟數據.
innodb_flush_log_at_trx_commit=2
事務提交時,刷新到os cache,系統沒有crash,數據無丟失.
(4)slave非實時寫redo和binlog丟失數據
在slave機器上會存在三個文件來保證事件的正確重放:relay log、 relay log info、 master info.
(5)異步模式
(6)semi sysnc
after_commit
比如主庫操作update t1 set val=1 where id=10將val從5修改為1 .
分析:
after_sync
比如主庫操作update t1 set val=1 where id=10將val從5修改為1.
分析:
知識點:兩階段提交
第一階段是先prepare、再同步寫redo log,第二階段同步寫binlog、再commit,如果在寫入commit標志時崩潰,則恢復時,會重新對commit標志進行寫入.
HA切換
(6)主從
binlog_format
ROW(最安全)
MIXED(不推薦)
STATEMENT(不推薦)
sync_binlog
=0:由os系統的刷新機制來控制,刷新數據到磁盤的頻率
=1:每次commit刷新到磁盤
>1:每N次提交刷新到磁盤
innodb_support_xa
版本要打開,保證binlog提交的順序,否則亂序的binlog在恢復或者slave應用的時候會有問題,及以后廢棄,始終支持兩階段提交.
crash safe
crash-safe就是將relay-info.log的信息保存在InnoDB的事務表中,這時執行relay log中的事務和寫relay info在一個事務中,就能得到原子性保證.從而避免已執行的binlog位點和寫入relay log info的位點信息不一致的情況發生.
IO thread
master-info-repository=TABLE
sync_master_info=N:每N個event刷新一次表
SQL thread
relay-log-info-repository=TABLE
sync_relay_info=N:每N個event刷新一次表
relay-log-recovery
當slave從庫宕機后,假如relay-log損壞了,導致一部分中繼日志沒有處理,則自動放棄所有未執行的relay-log,并且重新從master上獲取日志,這樣就保證了relay-log的完整性.
relay_log_info_repository = TABLE
relay_log_recovery = 1
http://mysqlserverteam.com/relay-log-recovery-when-sql-threads-position-is-unavailable/
semi_sync
GTID
相比位點復制,能減少不一致的概率
參考資料
- MySQL數據丟失討論http://hatemysql.com/?p=395
- 細看InnoDB數據落盤http://hatemysql.com/?p=503
- MySQL5.7 深度解析:Loss-Less半同步復制技術
- MySQL 5.7 Replication相關新功能說明
原文來自微信公眾號:DBAplus社群
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/2370.html