对于 mysql load 语句在 binlog 中的记录形式:
整顿自 实战 45 讲 + 本人的一些了解
一:binlog_format=statement
这个 load 语句记录到 binlog 里当前,怎么在备库重放呢?
因为 /server_tmp/t.csv 文件只保留在主库所在的主机上,如果只是把这条语句原文写到 binlog 中,在备库执行的时候,备库的本地机器上没有这个文件,就会导致主备同步进行。
所以,这条语句执行的残缺流程,其实是上面这样的。
主库执行实现后,将 /server_tmp/t.csv 文件的内容间接写到 binlog 文件中。
往 binlog 文件中写入语句 load data local infile‘/tmp/SQL_LOAD_MB-1-0’INTO TABLE db2
.t
。
把这个 binlog 日志传到备库。
备库的 apply 线程在执行这个事务日志时:
a. 先将 binlog 中 t.csv 文件的内容读出来,写入到本地长期目录 /tmp/SQL_LOAD_MB-1-0 中;
b. 再执行 load data 语句,往备库的 db2.t 表中插入跟主库雷同的游戏数据。
执行流程如图 2 所示:
图 2 load data 的同步流程
留神,这里备库执行的 load data 语句外面,多了一个“local”。它的意思是“将执行这条命令的客户端所在机器的本地文件 /tmp/SQL_LOAD_MB-1-0 的内容,加载到指标表 db2.t 中”。
也就是说,load data 命令有两种用法:
不加“local”,是读取服务端的文件,这个文件必须在 secure_file_priv 指定的目录或子目录下;
加上“local”,读取的是客户端的文件,只有 mysql 客户端有拜访这个文件的权限即可。这时候,MySQL 客户端会先把本地文件传给服务端,而后执行上述的 load data 流程。
二:binlog_format=row
不记录文件内容,间接记录的每行数据的扭转,如果 binlog_row_image=full,那么格式化 binlog 后能够看到记录每行数据的所有字段!
相似如下:
INSERT INTO liuwenhe
.items_1
SET
@1=10009 / INT meta=0 nullable=0 is_null=0 /
三:针对 binlog 格局为 statement 的格局 binlog 增量复原:
执行如下 load 语句后:
root@localhost : (none) 13:11:59>load data infile ‘/var/lib/mysql-files/1.txt’ into table liuwenhe.items_3;
如果想要借助 binlog 来实现复原数据,如果 binlog_format=statement 的格局,load 操作通过测试也是能够复原数据的,mysqlbinlog -vv 格式化后能够看到如下信息:
LOAD DATA LOCAL INFILE ‘/tmp/SQL_LOAD_MB-3-0’ INTO TABLE liuwenhe
www.sangpi.com.items_3
FIELDS TERMINATED BY ‘\t’ ENCLOSED BY ” ESCAPED BY ‘\’
LINES TERMINATED BY ‘\n’ (itemid
)
那么有个问题,如果你是想借助 binlog 来实现增量复原,那么他能找到 /tmp/SQL_LOAD_MB-3- 0 这个文件吗?
原来当你执行 mysqlbinlog mysql-bin.000154 文件的时候,主动就读取记录在 binlog 文件中的文件内容,并且写进 /tmp/SQL_LOAD_MB-3- 0 文件,也就是说当你执行 mysqlbinlog 格式化文件的时候,主动在对应的目录下生成 SQL_LOAD_MB-3- 0 文件! 而后才能够复原!
小结:所以须要留神,如果你要应用 binlog 实现增量复原,那么你必须保障你格式化 binlog 的机器,和你执行复原命令的机器是同一台,就是因为格式化的时候会产生 load 对应的临时文件