Binlog格式為ROW 詳解
一、基於RBR行複製是與記錄的位置有關,binlog裡只記錄了了相關表發生變化的列的資料,對此引入了4個事件:Table_map、Write_rows、Update_rows、Delete_rows。
二、在主庫上一條語句執行完,在binlog中記錄成:
Table_map事件(包含表的ID、表名和列的類型,沒有列名),再後面是3個事件,最後是結束標誌為STMT_END_F。
是mysqlbinlog後的結果:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/211221B21-0.png" title="a.png" alt="150241622.png" />
show binlog eventsin 'mysql-bin.001430' from 12893999 limit 4 \G
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/211221F44-1.png" title="b.png" alt="150257617.png" />
對於ROW格式的binlog在slave端的執行過程:
1.SQL進程從relaylog日誌讀取事件
2.對於Table_map事件,SQL進程提取表資訊,儲存表的定義
3.鎖定要更改的表,並檢查master和slave上的結構是否一致
4.如果表結構不一致,則停止複製,否則繼續執行,直到遇到STMT_END_F結束此事件的複製
對於Update_rows、Delete_rows事件,SQL進程首先要定位到具體的行,尋找步驟如下:
1.主鍵優先
優先選裝slave上的主鍵,當找到匹配的主索引值的時候,就認為已經找到匹配的行,行的其他列的內容則不去匹配。
2.非空唯一索引掃描,只比較索引值
3.其他索引或全表掃描:此時會比較整個行的資料在master和slave上是否一致確實能保證主從複製的一致性,但也是最慢的)。
最近公司建從庫備份資料(資料就不一致了),導致從庫在運行一段時間後,報錯,導致SQL進程中斷:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/2112211960-2.png" title="c.png" alt="150313723.png" />
Last_Errno: 1032Last_Error: Could not execute Delete_rows event on table mdb.item_info; Can't find record in 'item_info', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.001430, end_log_pos 12893999
本文出自 “My DBA life” 部落格,請務必保留此出處http://huanghualiang.blog.51cto.com/6782683/1298730