binlog_row_image - xiaoboluo768/qianjinliangfang GitHub Wiki
- 基于row格式时大量二进制日志非常浪费磁盘,如果这个值不为full(如为minimal那么就只记录改变的列和主键的内容,如果为noblob,那么记录时就排除blob和text字段类型的内容)就不会记录完整的内容,一般不要去动它。5.6之后的参数
- 该参数设置为minimal时,必须保证表中有主键或者不为null的唯一索引,否则可能导致主从数据不一致。特别是在双主+从库的架构中,主从数据的不一致可能导致从库数据混乱或者复制报错。
- 在基于行的复制中,每个行更改事件包含两个image,一个“before”image(在搜索要更新的行时匹配的列的修改之前的数据),以及一个“after”image(包含更改的列数据)。通常,MySQL记录after image的完整行(即所有列,也是默认值的行为)。但是,并不一定需要在两个iamge中都包含所有的列,在MySQL规范使用的前提下,可以只记录发生修改的列即可,这样通常可以节省磁盘,内存和网络使用率。
- 注意:删除行时,只记录before image,因为删除操作的记录没有要复制并传播的更改值。插入行时,仅记录after image,因为没有要匹配的现有行(旧数据)。只有在更新行时,before image和after image都需要记录,并且都写入二进制日志。
- 对于before image,要实现记录尽可能最少的列要求记录的行值必须能够被唯一匹配,唯一匹配可以使用主键、唯一索引、记录所有的列 三种形式,第一种:如果包含该行的表具有主键,则只需要把主键列写入二进制日志(主键有多少个列就会记录多少个列)。否则使用第二种:如果表具有唯一键且其所有列都不为NULL(多列唯一索引时,所有的列都要求不为null),则只记录唯一键中的列。 第三种情况,如果表既没有主键也没有没有任何所有列都不为NULL的唯一键,则所有列都必须在before image中记录,对于after image中,只需要记录实际已更改的列。
- 该参数有如下三个有效值
- full:记录before image和after image中的所有列
- minimal:仅记录before image中需要唯一标识要更改的行的那些列;仅记录实际更改的after image中的那些列。
- noblob:记录所有列(与full相同),但排除不需要唯一标识行或未发生更改的BLOB和TEXT列
- 注意:MySQL cluster不支持此变量;设置它对NDB表的日志记录没有影响。 (bug#16316828)---注:8.0中关于这个提示信息已经去掉了,应该已经支持NDB了
- 当使用minimal或noblob值时,如果当且仅当以下条件对于源表和目标表均为true时(如复制架构中的master中的表和slave中的表都满足以下条件时),才能确保删除和更新对于给定表正确地复制数据,如果不满足这些条件,则可能表明目标表中的主键列值不足以提供用于唯一匹配删除或更新行。在这种情况下,不会发出警告或错误;master和slave无声地产生数据分歧,从而导致主备数据不一致:
- 原表和目标表的表定义中列数量必须相同且顺序相同;每个列对应数据类型及其定义属性必须相同。
- 这些表必须具有相同的主键及其主键定义。
- 当二进制日志记录格式为STATEMENT时,设置此变量不起作用。当binlog_format为MIXED时,binlog_row_image的设置将应用于使用基于行的格式记录的更改,但此设置不会影响记录为语句的更改。
- 在全局或会话级别设置binlog_row_image不会导致隐式提交;这意味着可以在事务正在进行时更改此变量,对于活跃的事务没有影响。
- 全局变量,会话变量,动态变量,默认值为full,枚举类型。
上一篇:slave_parallel_workers | 下一篇:binlog_cache_size