最后更新于
最后更新于
MySQL 提供了三种不同的二进制日志格式用于复制:基于语句的、基于行的和混合模式。可以通过系统参数 binlog_format 控制日志写入时使用哪种日志格式。
基于语句的复制是通过记录所有在主库上执行的数据变更语句来实现的。当副本从中继日志读取到事件并执行时,实际上是重新执行在源端执行过的 SQL 语句。
这种格式的主要优点是简单且紧凑:一条更新了大量数据的 SQL 语句,在二进制日志中可能仅仅需要几十字节存储。
其最大的弊端则在于会遇到某些具有“不确定性”的 SQL 语句问题。假设有一条语句删除了一张有 1000 行记录的表中的 100 行,但没有用 ORDER BY 子句。如果在源和副本上,记录的排序不同,这条 SQL 语句在源和副本上删除的 100 条记录就会不同,这将导致数据不一致。
基于行的复制将事件写入二进制日志,该事件包含了该行记录发生了什么改变。
在基于行的复制模式下,每条被改变的记录都会作为事件被写入二进制日志,这可能会让二进制日志的大小发生巨大的增长。
“混合模式”(the mixed method)试图结合以上两种格式的优点。在这种模式下,事件的写入,默认使用基于语句的格式,仅在需要时才切换到基于行的格式。
在写入每个事件时会有很多的判断条件,以确定使用哪种格式,而这也会导致二进制日志中出现不可预测的事件。