mysql replication数据复制格式
1.1MySQL
replication数据复制格式
这里我们基于MySQL
5.1.20
Beta描述MySQL两个slave端的thread发送和接收数据的格式。某些字段所占的字节数跟MySQL的版本有关,这里我们所描述的为binlog版本为4,MySQL
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参数中依序填入下述的各个字段,并指定其中的参数command为COM_REGISTER_SLAVE以注册自己。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
图1、主服务器注册示意图
1.1.1.2向主服务器请求数据
从服务器向主服务器发送了请求数据的命令以后主服务器将根据要求将对应binlog文件的指定位置开始的事件记录发送给从服务器。向主服务器请求数据,可以调用mysql.h中的simple_command(mysql,
command, arg, length,
skip_check)函数,在arg参数中依序填入下述的各个字段,并指定其中的参数command为COM_BINLOG_DUMP。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果没有指定MySQL使用methods,那么我们应该调用函数sql_common.h头文件中的cli_advanced_command()代替simple_command()。
向主服务器请求了数据以后,从服务器就可以通过cli_safe_read(mysql);获得主服务器发送过来的数据,每次获得一个事件记录的数据。cli_safe_read的返回值标示了从主服务器发送过来的数据的数据字节数。而发送过来的数据保存在mysql->net->read_pos数组中。I/O
thread模块可以利用MySQL的io_cache将对应事件记录存储到relay-log文件中。
1.1.1.3MySQL
binlog文件初始化
由于MySQL
binlog的特殊性,以及为了mysqlbinlog工具能够识别我们relay-log文件,在新建一个relay-log文件时必须写入一定的初始化数据。这些初始化数据依序包括如下字段:
|
|
|
|
|
|
1.1.2MySQL
SQL thread数据格式
只要循环的调用cli_safe_read函数,从服务器可以不断得到从主服务器发送过来的事件记录。接下来我们介绍一下相关的一些事件记录格式。在提交了COM_BINLOG_DUMP命令后,主服务器首先给从服务器发送的两个事件依序分别为ROTATE_EVENT和FORMAT_DESCRIPTION_EVENT事件。ROTATE_EVENT事件用来标示接下来主服务器将从哪一个binlog文件的哪个位置开始发送事件记录。而FORMAT_DESCRIPTION_EVENT事件用来记录本MySQL
instance的server_id值,binlog版本号,MySQL
server的版本,本relay-log创建的时间以及各个不同事件的事件头所占的字节数等信息。我们关心的其他的事件记录的格式包括WRITE_ROWS_EVENT,UPDATE_ROWS_EVENT,DELETE_ROWS_EVENT等。
1.1.2.1事件头字段描述
各个事件都包括一个事件头,事件头的字段格式如下:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.1.2.2ROTATE_EVENT事件字段描述
由于各个事件的事件头基本一致,这里我们就不重复介绍事件头的各字段了,后面的各个事件我们也都将忽略对事件头字段的描述。
ROTATE_EVENT事件的附加事件头字段主要包括:
|
|
|
|
|
|
ROTATE_EVENT事件的其他信息字段主要包括:
|
|
|
|
|
|
1.1.2.3FORMAT_DESCRIPTION_EVENT事件字段描述
FORMAT_DESCRIPTION_EVENT事件的附加事件头的字段如下:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.1.2.4TABLE_MAP_EVENT事件字段描述
TABLE_MAP_EVENT事件的附加事件头的字段如下:
|
|
|
|
|
|
|
|
|
TABLE_MAP_EVENT事件的其他信息字段主要包括:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.1.2.5WRITE_ROWS_EVENT事件字段描述
WRITE_ROWS_EVENT事件的附加事件头的字段如下:
|
|
|
|
|
|
|
|
|
WRITE_ROWS_EVENT事件的其他信息字段主要包括:
|
|
|
|
|
|
|
|
|
|
|
|
1.1.2.6UPDATE_ROWS_EVENT事件字段描述
UPDATE_ROWS_EVENT事件的附加事件头的字段如下:
|
|
|
|
|
|
|
|
|
UPDATE_ROWS_EVENT事件的其他信息字段主要包括:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.1.2.7DELETE_ROWS_EVENT事件字段描述
DELETE_ROWS_EVENT事件的附加事件头的字段如下:
|
|
|
|
|
|
|
|
|
DELETE
_ROWS_EVENT事件的其他信息字段主要包括:
|
|
|
|
|
|
|
|
|
|
|
|
1.1.2.8XID_EVENT事件字段描述
XID_EVENT一般出现在一个事务操作(transaction)之后或者其他语句提交之后。它的主要作用是提交事务操作和把事件刷新至binlog文件中。
XID_EVENT事件的信息字段包括:
|
|
|
|
|
|