当CREATE TABLE … SELECT复制语句时,MySQL将应用以下规则 :
CREATE TABLE … SELECT总是执行隐式提交(第13.3.3节“导致隐式提交的声明”)。
如果目标表不存在,则按以下方式记录日志。是否IF NOT EXISTS存在都没有关系。
STATEMENT或MIXED 格式:该语句以书面形式记录。
ROW格式:该语句作为语句记录,CREATE TABLE 后面是一系列插入行事件。
如果该语句失败,则不记录任何内容。这包括目标表存在IF NOT EXISTS且未给出的情况。
如果目标表存在并IF NOT EXISTS给出,则MySQL会完全忽略该语句;没有插入或记录任何内容。
MySQL 5.6不允许 CREATE TABLE … SELECT语句对除该语句创建的表以外的表进行任何更改。这是对MySQL早期版本的行为更改,该行为允许这些语句执行此操作。这意味着,在MySQL 5.6或更高版本的从属服务器与运行早期版本MySQL的主服务器之间使用基于语句的复制时, CREATE TABLE … SELECT导致主服务器上其他表发生更改的语句在从服务器上失败,从而导致复制停止。为了避免这种情况的发生,您应该使用基于行的复制,在有问题的语句上在主服务器上运行之前重写它,或者将主服务器升级到MySQL 5.6(或更高版本)。(如果选择升级主数据库,请记住,CREATE TABLE … SELECT除非重写该 语句以消除对其他表的任何副作用,否则该语句将在升级后失败。)使用基于行的复制时,这不是问题,因为该语句记录为 CREATE TABLE语句,表数据的任何更改都记录为行插入事件,而不是整个记录 CREATE TABLE … SELECT。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




