16.4.1.6 复制 CREATE TABLE ... SELECT 语句

本节讨论 MySQL 如何复制创建 table...选择语句。

MySQL 5.7 不允许创建 table...选择语句对除该语句创建的 table 以外的 table 进行任何更改。某些旧版本的 MySQL 允许这些语句这样做。这意味着,当在 MySQL 5.6 或更高版本的副本与运行 MySQL 早期版本的源之间使用基于语句的复制时,导致源上其他 table 发生更改的创建 table...选择语句在副本上失败,从而导致复制停止。为了防止这种情况的发生,您应该使用基于行的复制,在有问题的源代码上运行之前重写有问题的语句,或者将源代码升级到 MySQL 5.7. (如果选择升级源,请记住,除非重写此创建 table...选择语句以消除对其他 table 的任何副作用,否则升级后将失败。)使用基于行的复制时,这不是问题,因为该语句记录为CREATE TABLE语句,并将对 table 数据的任何更改记录为行插入事件,而不是整个创建 table...选择

这些行为不依赖于 MySQL 版本:

  • 创建 table...选择始终执行隐式提交(第 13.3.3 节“导致隐式提交的声明”)。

  • 如果目标 table 不存在,则按以下方式记录日志。 IF NOT EXISTS是否存在并不重要。

  • STATEMENTMIXED格式:语句以书面形式记录。

    • ROW格式:该语句记录为CREATE TABLE语句,后跟一系列插入行事件。
  • 如果该语句失败,则不记录任何内容。这包括目标 table 存在且未给出IF NOT EXISTS的情况。

当目标 table 存在并且给出IF NOT EXISTS时,MySQL 5.7 会完全忽略该语句;没有插入或记录任何内容。