《一張思維導(dǎo)圖縱觀MySQL數(shù)據(jù)安全體系》要點:
本文介紹了一張思維導(dǎo)圖縱觀MySQL數(shù)據(jù)安全體系,希望對您有用。如果有疑問,可以聯(lián)系我們。
作者介紹 :
楊奇龍,前阿里數(shù)據(jù)庫團隊資深DBA,主要負責(zé)淘寶業(yè)務(wù)線,經(jīng)歷多次雙十一,有海量業(yè)務(wù)訪問DB架構(gòu)設(shè)計經(jīng)驗.目前就職于有贊科技,負責(zé)數(shù)據(jù)庫運維工作,熟悉MySQL性能優(yōu)化、故障診斷、性能壓測.
和團隊內(nèi)部的同事一起溝通,討論了MySQL數(shù)據(jù)庫系統(tǒng)數(shù)據(jù)安全性問題,主要針對MySQL丟數(shù)據(jù) 、主從不一致的場景 ,還有業(yè)務(wù)層面使用不得當(dāng)導(dǎo)致主備庫數(shù)據(jù)結(jié)構(gòu)不一樣的情況,本文是基于以上的討論和總結(jié)做的思維導(dǎo)圖.
(1)redo log
innodb_flush_log_at_timeout
< 5.6.6: 每隔一秒將redo log buffer中的數(shù)據(jù)刷新到磁盤
>= 5.6.6:每隔innodb_flush_log_at_timeout秒將數(shù)據(jù)刷新到磁盤中去
(2)binlog
sync_binlog? =1
(3)innodb buffer data
不同的flush mathod刷數(shù)據(jù)的圖形展示.圖片來自hatemysql.com.
(4)InnoDB 落盤
MySQL數(shù)據(jù)落盤的路徑,圖片來自李春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
事務(wù)提交時,不刷新緩存,系統(tǒng)刷新的頻率是1s,故會丟失1s的數(shù)據(jù).
innodb_flush_log_at_trx_commit=1
事務(wù)提交時,會刷新到磁盤,保證事務(wù)落盤,故不丟數(shù)據(jù).
innodb_flush_log_at_trx_commit=2
事務(wù)提交時,刷新到os cache,系統(tǒng)沒有crash,數(shù)據(jù)無丟失.
(3)DB正常,OS Crash
帶有 BBU
innodb_flush_log_at_trx_commit=0
事務(wù)提交時,不刷新緩存,系統(tǒng)刷新的頻率是1s,故會丟失1s的數(shù)據(jù).
innodb_flush_log_at_trx_commit=1
事務(wù)提交時,會刷新到磁盤,保證事務(wù)落盤,故不丟數(shù)據(jù).
innodb_flush_log_at_trx_commit=2
事務(wù)提交時,刷新到os cache,系統(tǒng)沒有crash,數(shù)據(jù)無丟失.
(4)slave非實時寫redo和binlog丟失數(shù)據(jù)
在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標(biāo)志時崩潰,則恢復(fù)時,會重新對commit標(biāo)志進行寫入.
HA切換
(6)主從
binlog_format
ROW(最安全)
MIXED(不推薦)
STATEMENT(不推薦)
sync_binlog
=0:由os系統(tǒng)的刷新機制來控制,刷新數(shù)據(jù)到磁盤的頻率
=1:每次commit刷新到磁盤
>1:每N次提交刷新到磁盤
innodb_support_xa
版本要打開,保證binlog提交的順序,否則亂序的binlog在恢復(fù)或者slave應(yīng)用的時候會有問題,及以后廢棄,始終支持兩階段提交.
crash safe
crash-safe就是將relay-info.log的信息保存在InnoDB的事務(wù)表中,這時執(zhí)行relay log中的事務(wù)和寫relay info在一個事務(wù)中,就能得到原子性保證.從而避免已執(zhí)行的binlog位點和寫入relay log info的位點信息不一致的情況發(fā)生.
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
當(dāng)slave從庫宕機后,假如relay-log損壞了,導(dǎo)致一部分中繼日志沒有處理,則自動放棄所有未執(zhí)行的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
相比位點復(fù)制,能減少不一致的概率
參考資料
- MySQL數(shù)據(jù)丟失討論http://hatemysql.com/?p=395
- 細看InnoDB數(shù)據(jù)落盤http://hatemysql.com/?p=503
- MySQL5.7 深度解析:Loss-Less半同步復(fù)制技術(shù)
- MySQL 5.7 Replication相關(guān)新功能說明
原文來自微信公眾號:DBAplus社群
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/2370.html