mysql replication数据复制格式



















1.1MySQL
replication
数据复制格式



这里我们基于MySQL
5.1.20
Beta
描述MySQL两个slave端的thread发送和接收数据的格式。某些字段所占的字节数跟MySQL的版本有关,这里我们所描述的为binlog版本为4MySQL
server
版本为5.1.20
Beta
下的数据格式。


1.1.1MySQL
I/O thread
数据格式


1.1.1.1向主服务器注册自己



向主服务器注册自己并不是一个必须的操作,如果没有注册同样可以向主服务器请求数据。如果需要向主服务器注册,那么可以调用mysql.h中的simple_command(mysql,
command, arg, length,
skip_check)
函数,在arg参数中依序填入下述的各个字段,并指定其中的参数commandCOM_REGISTER_SLAVE以注册自己。



































































名称




字节数




含义




server_id




4




MySQL
instance
server_id




strlen(report_host)




1 or
2




标识接下来的report_host的长度,如果长度<2511个字节,否则占两个字节




report_host




Strlen(report_host)




向主服务器注册的MySQL
instance
标识




strlen(report_user)




1 or
2




标识接下来的report_user的长度,如果长度<2511个字节,否则占2个字节




report_user




Strlen(report_user)




向主服务器注册的用户名




strlen(report_password)




1 or
2




标识接下来的report_password的长度,如果长度<2511个字节,否则占2个字节




report_password




Strlen(report_password)




向主服务器注册的密码




report_port




2




向主服务器注册的端口




rpl_recovery_rank




4




复制的恢复等级




master_id




4




填入0,主服务器将自行填入master_id




1、主服务器注册示意图







1.1.1.2向主服务器请求数据



从服务器向主服务器发送了请求数据的命令以后主服务器将根据要求将对应binlog文件的指定位置开始的事件记录发送给从服务器。向主服务器请求数据,可以调用mysql.h中的simple_command(mysql,
command, arg, length,
skip_check)
函数,在arg参数中依序填入下述的各个字段,并指定其中的参数commandCOM_BINLOG_DUMP





































名称




字节数




含义




master_log_pos




4




请求主服务器发送的事件记录在binlog文件中的偏移量




binlog_flags




2




暂时填0,做扩展用




server_id




4




MySQL
instance
server_id




logname




Strlen(logname)




请求主服务器发送的binlog文件的文件名




如果没有指定MySQL使用methods,那么我们应该调用函数sql_common.h头文件中的cli_advanced_command()代替simple_command()。



向主服务器请求了数据以后,从服务器就可以通过cli_safe_read(mysql);获得主服务器发送过来的数据,每次获得一个事件记录的数据。cli_safe_read的返回值标示了从主服务器发送过来的数据的数据字节数。而发送过来的数据保存在mysql->net->read_pos数组中。I/O
thread
模块可以利用MySQLio_cache将对应事件记录存储到relay-log文件中。






1.1.1.3MySQL
binlog
文件初始化



由于MySQL
binlog
的特殊性,以及为了mysqlbinlog工具能够识别我们relay-log文件,在新建一个relay-log文件时必须写入一定的初始化数据。这些初始化数据依序包括如下字段:


















名称




字节数




含义




BINLOG_MAGIC("\xfe\x62\x69\x6e")




BIN_LOG_HEADER_SIZE(4)




Binlog文件的标识值







1.1.2MySQL
SQL thread
数据格式



只要循环的调用cli_safe_read函数,从服务器可以不断得到从主服务器发送过来的事件记录。接下来我们介绍一下相关的一些事件记录格式。在提交了COM_BINLOG_DUMP命令后,主服务器首先给从服务器发送的两个事件依序分别为ROTATE_EVENTFORMAT_DESCRIPTION_EVENT事件。ROTATE_EVENT事件用来标示接下来主服务器将从哪一个binlog文件的哪个位置开始发送事件记录。而FORMAT_DESCRIPTION_EVENT事件用来记录本MySQL
instance
server_id值,binlog版本号,MySQL
server
的版本,本relay-log创建的时间以及各个不同事件的事件头所占的字节数等信息。我们关心的其他的事件记录的格式包括WRITE_ROWS_EVENTUPDATE_ROWS_EVENTDELETE_ROWS_EVENT等。






1.1.2.1事件头字段描述



各个事件都包括一个事件头,事件头的字段格式如下:











































名称




字节数




含义




When




4




事件的创建时间。




Type




1




事件的类型(见附录1)




server_id




4




事件发生时所在MySQLserver_id值。




data_written




4




该事件一共占用的字节数,包括事件头的字节数。




log_pos




4




下一事件在binlog文件中将要开始的位置,即本事件的结束位置




Flags




2




事件的其他标志位。







1.1.2.2ROTATE_EVENT事件字段描述



由于各个事件的事件头基本一致,这里我们就不重复介绍事件头的各字段了,后面的各个事件我们也都将忽略对事件头字段的描述。



ROTATE_EVENT事件的附加事件头字段主要包括:


















名称




字节数




含义




pos




8




主服务器将要发送的事件记录在binlog文件中的偏移量。一般为从服务器提交的COM_BINLOG_DUMP请求中的偏移量值。




ROTATE_EVENT事件的其他信息字段主要包括:


















名称




字节数




含义




new_log_ident




strlen(new_log_ident)




主服务器将要发送的事件记录的binlog文件名。一般为从服务器提交的COM_BINLOG_DUMP请求中的binlog文件名。







1.1.2.3FORMAT_DESCRIPTION_EVENT事件字段描述



FORMAT_DESCRIPTION_EVENT事件的附加事件头的字段如下:






































名称




字节数




含义




binlog_version




2




Binlog文件的版本号,这里一般为最新的版本号4




server_version




ST_SERVER_VER_LEN(50)




MySQL的版本号。例如:”
5.1.20-beta-log”




Created




4




事件创建时间,这里一般和事件头中的when一致




event_header_len




1




一般事件的事件头长度,一般设置为:LOG_EVENT_HEADER_LEN(19)




post_header_len




ENUM_END_EVENT-1(26)




不同事件类型的附加事件头的长度,见附录2








1.1.2.4TABLE_MAP_EVENT事件字段描述



TABLE_MAP_EVENT事件的附加事件头的字段如下:























名称




字节数




含义




m_table_id




6(5.1.4前的版本中为4)




表的id标识符




m_flags




2




表的各种标志位,见附录4




TABLE_MAP_EVENT事件的其他信息字段主要包括:











































名称




字节数




含义




m_dblen




1




数据库名的长度




m_dbnam




m_dblen+1




数据库名,以’\0’结尾




m_tbllen




1




表名的长度




m_tblnam




m_tbllen+1




表名,以’\0’结尾




m_colcnt




net_field_length()




表的字段个数,所占字节数根据第一个字节的大小由net_field_length函数确定




m_coltype




m_colcnt




表的各个字段的字段类型,参见附录3








1.1.2.5WRITE_ROWS_EVENT事件字段描述



WRITE_ROWS_EVENT事件的附加事件头的字段如下:























名称




字节数




含义




m_table_id




6(5.1.4前的版本中为4)




表的id标识符




m_flags




2




表的各种标志位,见附录4




WRITE_ROWS_EVENT事件的其他信息字段主要包括:




























名称




字节数




含义




m_width




net_field_length()




表的各列的位图长度,所占字节数根据第一个字节的大小由net_field_length函数确定




m_cols.bitmap




(m_width
+ 7) / 8




表的各列的位图,每一位表示m_rows_buf是否包含表中一列的值,如果没有置位表示该列的值没有包含在m_rows_buf




m_rows_buf




剩余字节数(len-已占字节数)




将要插入到表中的一行数据值。







1.1.2.6UPDATE_ROWS_EVENT事件字段描述



UPDATE_ROWS_EVENT事件的附加事件头的字段如下:























名称




字节数




含义




m_table_id




6(5.1.4前的版本中为4)




表的id标识符




m_flags




2




表的各种标志位,见附录4




UPDATE_ROWS_EVENT事件的其他信息字段主要包括:

































名称




字节数




含义




m_width




net_field_length()




表的各列的位图长度,所占字节数根据第一个字节的大小由net_field_length函数确定




m_cols.bitmap




(m_width
+ 7) / 8




表中被匹配行数据的各列的位图,每一位表示m_rows_buf是否包含表中该列的值。




m_cols_ai.bitmap




(m_width
+ 7) / 8




表中将要更新的行数据的各列的位图,每一位表示m_rows_buf是否包含表中一列的值。




m_rows_buf




剩余字节数(len-已占字节数)




表中被匹配的那一行数据的值以及将要更新的一行数据值。








1.1.2.7DELETE_ROWS_EVENT事件字段描述



DELETE_ROWS_EVENT事件的附加事件头的字段如下:























名称




字节数




含义




m_table_id




6(5.1.4前的版本中为4)




表的id标识符




m_flags




2




表的各种标志位




DELETE
_ROWS_EVENT
事件的其他信息字段主要包括:




























名称




字节数




含义




m_width




net_field_length()




表的各列的位图长度,所占字节数根据第一个字节的大小由net_field_length函数确定




m_cols.bitmap




(m_width
+ 7) / 8




表的各列的位图,每一位表示m_rows_buf是否包含表中一列的值。




m_rows_buf




剩余字节数(len-已占字节数)




表中将要删除的一行数据值。







1.1.2.8XID_EVENT事件字段描述



XID_EVENT一般出现在一个事务操作(transaction)之后或者其他语句提交之后。它的主要作用是提交事务操作和把事件刷新至binlog文件中。



XID_EVENT事件的信息字段包括:


















名称




字节数




含义




xid




sizeof(xid)
8




commit标识符











5




Leave a Reply