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  /  The InnoDB Storage Engine  /  InnoDB and MySQL Replication

17.19 InnoDB 和 MySQL 复制

可以使用复制,以便在副本上使用不同的存储引擎,而不是源上的存储引擎。例如,可以将源上的 InnoDB 表的修改复制到副本上的 MyISAM 表。有关更多信息,请参阅:第 19.4.4 节,“使用不同源和副本存储引擎的复制”

有关设置副本的信息,请参阅:第 19.1.2.6 节,“设置副本”,和 第 19.1.2.5 节,“选择数据快照方法”。要在不关闭源或现有副本的情况下创建新副本,请使用 MySQL 企业备份 产品。

源上的事务失败不会影响复制。MySQL 复制基于二进制日志,其中 MySQL 写入修改数据的 SQL 语句。失败的事务(例如,因外键违规或回滚)不会写入二进制日志,因此不会发送到副本。请参阅:第 15.3.1 节,“START TRANSACTION、COMMIT 和 ROLLBACK 语句”

复制和 CASCADE.  在源上的 InnoDB 表的级联操作仅在副本上执行,如果共享外键关系的表使用 InnoDB 存储引擎在源和副本上。这适用于基于语句的复制和基于行的复制。假设您已经启动了复制,然后在源上创建了两个表,使用以下 CREATE TABLE 语句:

CREATE TABLE fc1 (
    i INT PRIMARY KEY,
    j INT
);

CREATE TABLE fc2 (
    m INT PRIMARY KEY,
    n INT,
    FOREIGN KEY ni (n) REFERENCES fc1 (i)
        ON DELETE CASCADE
);

如果副本的默认存储引擎是 MyISAM,则在副本上创建相同的表,但它们使用 MyISAM 存储引擎,并忽略 FOREIGN KEY 选项。

source> INSERT INTO fc1 VALUES (1, 1), (2, 2);
Query OK, 2 rows affected (0.09 sec)
Records: 2  Duplicates: 0  Warnings: 0

source> INSERT INTO fc2 VALUES (1, 1), (2, 2), (3, 1);
Query OK, 3 rows affected (0.19 sec)
Records: 3  Duplicates: 0  Warnings: 0

现在,在源和副本上,我们插入一些行到表中:

source> SELECT * FROM fc1;
+---+------+
| i | j    |
+---+------+
| 1 |    1 |
| 2 |    2 |
+---+------+
2 rows in set (0.00 sec)

source> SELECT * FROM fc2;
+---+------+
| m | n    |
+---+------+
| 1 |    1 |
| 2 |    2 |
| 3 |    1 |
+---+------+
3 rows in set (0.00 sec)

replica> SELECT * FROM fc1;
+---+------+
| i | j    |
+---+------+
| 1 |    1 |
| 2 |    2 |
+---+------+
2 rows in set (0.00 sec)

replica> SELECT * FROM fc2;
+---+------+
| m | n    |
+---+------+
| 1 |    1 |
| 2 |    2 |
| 3 |    1 |
+---+------+
3 rows in set (0.00 sec)

现在,在源和副本上,表 fc1 包含 2 行,表 fc2 包含 3 行,如下所示:

source> DELETE FROM fc1 WHERE i=1;
Query OK, 1 row affected (0.09 sec)

现在,假设您在源上执行以下 DELETE 语句:

source> SELECT * FROM fc2;
+---+---+
| m | n |
+---+---+
| 2 | 2 |
+---+---+
1 row in set (0.00 sec)

由于级联,源上的表 fc2 现在只包含 1 行:

replica> SELECT * FROM fc2;
+---+---+
| m | n |
+---+---+
| 1 | 1 |
| 3 | 1 |
| 2 | 2 |
+---+---+
3 rows in set (0.00 sec)

然而,级联不会在副本上传播,因为在副本上 fc1DELETE 不删除 fc2 的任何行。副本上的 fc2 副本仍然包含所有原始插入的行: