从库需要通知主库“我知道事件的尾部是校验和,并且希望你发送校验和给我”。这个操作需要在发送COM_BINLOG_DUMP命令之前完成,否则服务器发送完一个事件之后(应该是个伪ROTATE事件,并且事件长度不包括校验和的4个字节)立即附带一个ERROR包。文本字段内容是:“Slave can not handle replication events with the checksum that master is configured to log”。
通知方法是:发送一个COM_QUERY命令,内容是“SET @master_binlog_checksum= @@global.binlog_checksum”。在MySQL5.6.14的rpl_slave.cc Line 2154中,发送过后还发送了第二个COM_QUERY命令,内容是“SELECT @master_binlog_checksum”,查询结果应该是“CRC32”。这说明主库做了CRC校验,并且主库知道从库能够正确的解析完整性校验结果。
header:
if post_header_len == 6 {
4 table id
} else {
6 table id
}
2 flags
if version == 2 {
2 extra-data-length
string.var_len extra-data
}
body:
lenenc_int number of columns
string.var_len columns-present-bitmap1, length: (num of columns+7)/8
if UPDATE_ROWS_EVENTv1 or v2 {
string.var_len columns-present-bitmap2, length: (num of columns+7)/8
}
rows:
string.var_len nul-bitmap, length (bits set in 'columns-present-bitmap1'+7)/8
string.var_len value of each field as defined in table-map
if UPDATE_ROWS_EVENTv1 or v2 {
string.var_len nul-bitmap, length (bits set in 'columns-present-bitmap2'+7)/8
string.var_len value of each field as defined in table-map
}
... repeat rows until event-end