Spec-Zone .ru
спецификации, руководства, описания, API
|
This section discusses how MySQL replicates CREATE TABLE ... SELECT
statements.
MySQL 5.6 does not allow a CREATE
TABLE ... SELECT
statement to make any changes in tables other than the table that is created by the
statement. This is a change in behavior from previous versions of MySQL, which permitted these statements to do
so. This means that, when using statement-based replication between a MySQL 5.6 or later slave and a master
running a previous version of MySQL, a CREATE TABLE ... SELECT
statement causing changes in other tables on the
master fails on the slave, causing replication to stop. To keep this from happening, you should use row-based
replication, rewrite the offending statement before running it on the master, or upgrade the master to MySQL 5.6
(or later). (If you choose to upgrade the master, keep in mind that such a CREATE TABLE ... SELECT
statement will fail following the upgrade unless it
is rewritten to remove any side effects on other tables.) This is not an issue when using row-based replication,
because the statement is logged as a CREATE
TABLE
statement with any changes to table data logged as row-insert events, rather than as the
entire CREATE TABLE ... SELECT
.
These behaviors are not dependent on MySQL version:
CREATE
TABLE ... SELECT
always performs an implicit commit (Section
13.3.3, "Statements That Cause an Implicit Commit").
If destination table does not exist, logging occurs as follows. It does not matter
whether IF NOT EXISTS
is present.
STATEMENT
or MIXED
format: The statement is logged as written.
ROW
format: The statement is logged as a CREATE TABLE
statement followed by a series of insert-row events.
If the statement fails, nothing is logged. This includes the case that the
destination table exists and IF NOT EXISTS
is not given.
When the destination table exists and IF NOT EXISTS
is given, MySQL handles the
statement in a version-dependent way.
In MySQL 5.1 before 5.1.51 and in MySQL 5.5 before 5.5.6 (this is the original behavior):
STATEMENT
or MIXED
format:
The statement is logged as written.
ROW
format: The statement is logged as a CREATE TABLE
statement followed by a series of insert-row events.
In MySQL 5.1 as of 5.1.51:
STATEMENT
or MIXED
format:
The statement is logged as the equivalent pair of CREATE TABLE
and INSERT INTO ... SELECT
statements.
ROW
format: The statement is logged as a CREATE TABLE
statement followed by a series of insert-row events.
In MySQL 5.5 as of 5.5.6:
Nothing is inserted or logged.
These version dependencies arise due to a change in MySQL 5.5.6 in handling of CREATE TABLE ... SELECT
not to insert rows if the destination table already
exists, and a change made in MySQL 5.1.51 to preserve forward compatibility in replication of such statements
from a 5.1 master to a 5.5 slave. For details, see Section
13.1.17.1, "CREATE TABLE ... SELECT
Syntax".