服务器使用多种日志记录格式在二进制日志中记录信息:
MySQL 中的复制功能最初是基于 SQL 语句从源到副本的传播。这称为基于语句的日志记录。您可以通过使用 启动服务器来使用此格式
--binlog-format=STATEMENT
。在基于行的日志记录(默认)中,源将事件写入二进制日志,指示各个表行如何受到影响。您可以通过使用 启动它来使服务器使用基于行的日志记录
--binlog-format=ROW
。第三个选项也可用:混合日志记录。对于混合日志记录,默认情况下使用基于语句的日志记录,但在某些情况下日志记录模式会自动切换为基于行,如下所述。您可以通过使用选项 启动mysqld来使 MySQL 显式使用混合日志记录
--binlog-format=MIXED
。
日志记录格式也可以由正在使用的存储引擎设置或限制。这有助于消除在使用不同存储引擎的源和副本之间复制某些语句时出现的问题。
对于基于语句的复制,复制非确定性语句可能会出现问题。在决定给定语句对于基于语句的复制是否安全时,MySQL 确定它是否可以保证可以使用基于语句的日志记录来复制该语句。如果 MySQL 不能做出这种保证,它会将语句标记为潜在不可靠并发出警告,Statement may not be safe to log in statement format。
您可以改用 MySQL 的基于行的复制来避免这些问题。