
2.7.1 参数影响
这个参数一共有三种取值,除了官方文档,笔者觉得源码中的如下注释也比较清晰,如表2-2所示。
表2-2

这里的read_set和write_set分别代表columns_before_image位图和columns_after_image位图。我们在解释DML Event的时候多次提到,这里对应一下,如下。
INSERT语句:记录变更的after_image(插入的数据),内部使用write_set过滤。
DELETE语句:记录变更的before_image(删除的数据),内部使用read_set过滤。
UPDATE语句:记录变更的before_image和after_image(修改的数据),内部使用read_set和write_set过滤。
本节主要讨论MINIMAL和FULL设置。对于上面源码的说明进行如下解释。
MINIMAL:对于before_image,只会记录主键或者第一个非空的唯一键到Event。而对于after_image,只会记录需要变更的字段,包括自增值。
FULL:对于前映像和后映像,都记录全部字段。注意,不仅某些闪回工具依赖这种设置,记录全部字段对于我们诊断问题、修复数据也有帮助。同时,设置为FULL可以让从库在选择索引的时候有更多的选择,提高从库应用Event的效率。关于从库数据的查找将会在4.6节详细解释。如果没有对磁盘空间的要求,那么本参数最好设置为FULL。
注意,如果表中没有主键也没有非空的唯一键,那么即便是设置参数 binlog_row_image 为MINIMAL,before_image也会记录全部的字段值。我们来看看THD::binlog_prepare_row_images函数中的源码片段,如下。

如果table->s->primary_key < MAX_KEY条件不满足,即没有找到主键或者非空唯一键,则read_set不会改变,将保持记录全字段。