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

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

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

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

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

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

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

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

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

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

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

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