Binlog格式為ROW 詳解及遇到的問題

來源:互聯網
上載者:User

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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.