Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Determination of Safe and Unsafe Statements in Binary Logging

19.2.1.3 二进制日志记录中的安全和不安全语句的确定

在 MySQL 复制中,语句的“安全性”是指该语句和其效果是否可以使用基于语句的格式正确地复制。如果语句满足这个条件,我们将其称为 安全;否则,我们将其称为 不安全

一般来说,一个语句是安全的,如果它是确定性的;否则,它是不安全的。然而,一些非确定性函数不被认为是不安全的(见 不被认为是不安全的非确定性函数,本节后面)。此外,使用浮点数数学函数的结果的语句——这些函数是硬件依赖的——总是被认为是不安全的(见 第 19.5.1.12 节,“复制和浮点数值”)。

安全和不安全语句的处理。 语句的处理方式取决于该语句是否被认为是安全的,以及当前的二进制日志记录格式(即 binlog_format 的当前值)。

  • 使用基于行的日志记录时,不区分安全和不安全语句。

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

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

每个被标记为不安全的语句都会生成警告。如果源上执行了大量这样的语句,这可能会导致错误日志文件变得非常大。为了防止这种情况,MySQL 有一个警告抑制机制。只要在 50 秒内生成了 50 个以上的 ER_BINLOG_UNSAFE_STATEMENT 警告,警告抑制机制就会被激活。当激活时,这将导致这些警告不被写入错误日志;相反,每 50 个警告将写入一条 The last warning was repeated N times in last S seconds 信息到错误日志中。这将继续下去,直到最近的 50 个警告是在 50 秒内生成的;一旦速率降低到这个阈值以下,警告将再次正常记录。警告抑制机制对语句的安全性判定和警告发送到客户端没有影响。MySQL 客户端仍将收到每个这样的语句的一个警告。

有关更多信息,请参阅 第 19.2.1 节,“复制格式”

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

更多信息,请参见第19.5.1节,“复制功能和问题”