14.20 InnoDB 和 MySQL 复制
MySQL 复制适用于InnoDB
table,适用于MyISAM
table。也可以通过以下方式使用复制:副本上的存储引擎与源上的原始存储引擎不同。例如,您可以将对源InnoDB
table 的修改复制到副本服务器上的MyISAM
table。有关更多信息,请参见第 16.3.3 节“将复制与不同的源和副本存储引擎一起使用”。
有关为源设置新副本的信息,请参见第 16.1.2.5 节,“设置副本”和第 16.1.2.4 节,“选择数据快照的方法”。要制作新副本而不删除源或现有副本,请使用MySQL 企业备份产品。
源失败的事务根本不会影响复制。 MySQL 复制基于二进制日志,其中 MySQL 编写修改数据的 SQL 语句。失败的事务(例如,由于违反外键或由于其已回退)不会被写入二进制日志,因此不会发送到副本。参见第 13.3.1 节“ START TRANSACTION,COMMIT 和 ROLLBACK 语句”。
复制和 CASCADE. 仅当共享外键关系的 table 在源和副本上都使用InnoDB
时,才在副本上复制源InnoDB
table 的级联操作。无论您使用的是基于语句的复制还是基于行的复制,都是如此。假设您已经开始复制,然后使用以下CREATE TABLE语句在源上创建两个 table:
CREATE TABLE fc1 (
i INT PRIMARY KEY,
j INT
) ENGINE = InnoDB;
CREATE TABLE fc2 (
m INT PRIMARY KEY,
n INT,
FOREIGN KEY ni (n) REFERENCES fc1 (i)
ON DELETE CASCADE
) ENGINE = InnoDB;
假设副本没有启用InnoDB
支持。如果是这种情况,则会创建副本上的 table,但它们使用MyISAM
存储引擎,而FOREIGN KEY
选项将被忽略。现在,我们在源代码的 table 中插入一些行:
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
此时,在源和副本上,tablefc1
包含 2 行,tablefc2
包含 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)
由于级联,源上的 tablefc2
现在仅包含 1 行:
source> SELECT * FROM fc2;
+---+---+
| m | n |
+---+---+
| 2 | 2 |
+---+---+
1 row in set (0.00 sec)
但是,级联不会在副本上传播,因为DELETE代 tablefc1
在副本上不会从fc2
删除任何行。副本的fc2
副本仍包含最初插入的所有行:
replica> SELECT * FROM fc2;
+---+---+
| m | n |
+---+---+
| 1 | 1 |
| 3 | 1 |
| 2 | 2 |
+---+---+
3 rows in set (0.00 sec)
这种差异是由于级联删除操作是由InnoDB
存储引擎在内部处理的事实所致,这意味着未记录任何更改。