Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 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 Enterprise Backup产品。

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

复制和 CASCADE.  对于源服务器上的 InnoDB 表,仅在源服务器和副本服务器都使用 InnoDB 存储引擎时,才会在副本服务器上执行 cascading 操作。这是无论您使用语句复制或行级复制。假设您已经启动了复制,然后在源服务器上创建两个表,其中 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

在这时,源服务器和副本服务器上的表 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)

由于 cascade,源服务器上的表 fc2 现在只包含 1 行:

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

然而,cascade 并没有在副本服务器上传播,因为副本服务器上的DELETE 语句对 fc1 删除了无行,从而副本服务器上的 fc2 表仍包含原始插入的所有行:

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

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