MySQL 8.0 参考手册  / 第十七章复制  / 17.2 复制实现  / 17.2.1 复制格式  /  17.2.1.3 二进制日志中安全和不安全语句的确定

17.2.1.3 二进制日志中安全和不安全语句的确定

MySQL 复制中一条语句的安全性”是指该语句及其作用是否可以使用基于语句的格式正确复制。如果该陈述为真,我们称该陈述为 安全的;否则,我们将其称为不安全的。

通常,如果语句是确定性的,则它是安全的;如果不是,则它是不安全的。但是,某些非确定性函数 被认为是不安全的(请参阅 本节后面的非确定性函数不被认为是不安全的)。此外,使用依赖于硬件的浮点数学函数结果的语句始终被认为是不安全的(请参阅 第 17.5.1.12 节,“复制和浮点值”)。

处理安全和不安全的语句。  根据语句是否被认为是安全的,以及相对于二进制日志记录格式(即 的当前值 binlog_format),对语句进行不同的处理。

  • 使用基于行的日志记录时,安全和不安全语句的处理没有区别。

  • 使用混合格式日志记录时,标记为不安全的语句将使用基于行的格式进行记录;使用基于语句的格式记录被视为安全的语句。

  • 使用基于语句的日志记录时,标记为不安全的语句会为此生成警告。安全语句正常记录。

每个标记为不安全的语句都会生成警告。如果在源上执行大量此类语句,可能会导致错误日志文件过大。为了防止这种情况,MySQL 有警告抑制机制。每当 50 个最近的 ER_BINLOG_UNSAFE_STATEMENT 警告在任何 50 秒内生成超过 50 次时,就会启用警告抑制。激活后,这会导致此类警告不会写入错误日志;相反,对于这种类型的每 50 个警告,一个注释The last warning was repeated N times in last S seconds被写入错误日志。只要最近 50 次此类警告在 50 秒或更短时间内发出,这种情况就会继续;一旦速率降低到该阈值以下,警告将再次正常记录。警告抑制不会影响如何确定基于语句的日志记录的语句安全性,也不会影响如何将警告发送到客户端。对于每个这样的语句,MySQL 客户端仍然会收到一个警告。

有关详细信息,请参阅第 17.2.1 节,“复制格式”

语句被认为是不安全的。  具有以下特征的语句被认为是不安全的:

有关其他信息,请参阅 第 17.5.1 节,“复制功能和问题”