Documentation Home
MySQL 8.0 参考手册  / 第 15 章 InnoDB 存储引擎  /  14.20 InnoDB和MySQL复制

14.20 InnoDB和MySQL复制

可以以副本上的存储引擎与源上的存储引擎不同的方式使用复制。例如,您可以 InnoDB将对源上表的 修改复制到MyISAM副本上的表。有关详细信息,请参阅第 16.3.3 节,“使用具有不同源和副本存储引擎的复制”

有关设置副本的信息,请参阅 第 16.1.2.5 节,“设置副本”第 16.1.2.4 节,“选择数据快照的方法”。要在不删除源或现有副本的情况下创建新副本,请使用 MySQL Enterprise Backup产品。

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

复制和级联。 当共享外键关系的表 同时在源和副本上使用时,才会InnoDB在副本上执行源上表的 级联操作。无论您使用的是基于语句还是基于行的复制,都是如此。假设你已经开始复制,然后在源上创建两个表,其中 定义为默认存储引擎,使用以下 语句: InnoDBInnoDBCREATE 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

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

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)

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

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

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

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

但是,级联不会在副本上传播,因为在副本上DELETEfor fc1不会删除任何行fc2。副本的副本fc2仍然包含最初插入的所有行:

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

这种差异是由于级联删除是由InnoDB存储引擎在内部处理的,这意味着没有任何更改被记录下来。