前言
本文主要介紹 MySQL 主備資料同步的重要日志 binlog 的三種格式,和雙 M 結構的回圈復制問題,
binlog三種格式
1. statement格式
直接存盤了執行的 SQL 陳述句,并且存盤了時間戳,大部分情況下不會出現主從不一致的情況,但是,還是存在某些特殊情況下,比如主從庫執行陳述句時使用的索引不一樣(因為存在統計模糊量,所以執行代價評估的時候結果可能不同),最后導致更新的結果不一致,
總結:statement的優點在于占用的存盤空間較小,但是可能會出現主從資料不一致的情況,所以基本不采用statement格式,
2. row格式
row 格式下,binlog 中記錄了執行前后的行記錄欄位值,方便資料回滾,binlog_row_image 默認配置為 FULL,所以 binlog 中會記錄行的全欄位值,如果修改為 MINIMAL,則只會記錄一些必要的欄位值,
總結:因為 row 格式下記錄了修改的欄位值,所以主從同步時不會發生資料不一致,但是因為會記錄更新前后的欄位值,占用的存盤空間會大很多,
3. mixed格式
既然有了 row 格式,為什么還要 mixed 格式呢?
mixed 格式就是 statement 格式和 row 格式的混合,MySQL 會判斷當陳述句不會導致主從資料不一致時,就采用 statement 格式記錄,否則采用 row 格式節省存盤空間,即 mixed 格式結合了 statement 和 row 格式的優點,
雖然 mixed 格式看著比 row 格式更有優勢,但是當前更多的場景下還是使用 row 格式,其中,一個比較明顯的原因就是 row 格式恢復資料很方便,
回圈復制問題
生產環境中使用較多的是雙 Master 的結構,即一臺主機和一臺備機之間互為主備,這樣存在一個問題,主機更新后的 binlog 同步到備機后,備機的 binlog 也會更新然后又同步到主機,這樣不就發生回圈復制了么?
這個問題的解決辦法是,row 格式的 binlog 中記錄了 server id,備機同步 binlog 時會繼續使用主機傳過來的 server id,這樣從機將 binlog 傳回主機時,主機判斷 binlog 中的 server id 和本機一致,就會終止 binlog 的同步,從而打斷回圈復制,
參考
- [1] MySQL是怎么保證主備一致的
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/305870.html
標籤:其他
上一篇:MySQL45講之主備資料一致性
下一篇:Mybatis-Plus分頁查詢
