InnoDB和MySQL复制
MySQL复制适用于InnoDB
表,适用于MyISAM
表。还可以通过以下方式使用复制:从属服务器上的存储引擎与主服务器上的原始存储引擎不同。例如,您可以InnoDB
将对主服务器上的MyISAM
表的修改复制到从服务器上的表。有关更多信息,请参见“在不同的主存储和从存储引擎中使用复制”。
有关为主服务器设置新的从服务器的信息,请参见“设置复制从站”和“为数据快照选择方法”。要在不关闭主服务器或现有从服务器的情况下创建新的从服务器,请使用 MySQL Enterprise Backup产品。
在主服务器上失败的事务根本不会影响复制。MySQL复制基于二进制日志,其中MySQL编写修改数据的SQL语句。失败的事务(例如,由于违反外键或由于其已回退)不会写入二进制日志,因此不会发送给从属。请参见“ START TRANSACTION,COMMIT和ROLLBACK语句”。
复制和CASCADE。仅当共享外键关系的表同时在主服务器和从服务器上使用时,主服务器InnoDB
上的表的级联操作才会在从服务器上复制InnoDB
。无论您使用的是基于语句的复制还是基于行的复制,都是如此。假设您已经开始复制,然后使用以下CREATE TABLE
语句在主数据库上创建两个表:
CREATE TABLE fc1 ( i INTPRIMARY KEY , j INT )ENGINE = InnoDB;CREATE TABLE fc2 ( m INTPRIMARY KEY , n INT,FOREIGN KEY ni (n)REFERENCES fc1 (i)ON DELETE CASCADE )ENGINE = InnoDB;
假设从站未InnoDB
启用支持。如果是这种情况,则会创建从属服务器上的表,但它们使用MyISAM
存储引擎,并且该FOREIGN KEY
选项将被忽略。现在,我们将一些行插入到主数据库的表中:
master >INSERT INTO fc1VALUES (1, 1), (2, 2); Query OK, 2 rows affected (0.09 sec) Records: 2 Duplicates: 0 Warnings: 0master >INSERT INTO fc2VALUES (1, 1), (2, 2), (3, 1); Query OK, 3 rows affected (0.19 sec) Records: 3 Duplicates: 0 Warnings: 0
此时,在主服务器和从服务器上,表fc1
包含2行,表fc2
包含3行,如下所示:
master >SELECT *FROM fc1; +--- +------ + | i | j | +--- +------ + | 1 | 1 | | 2 | 2 | +--- +------ + 2 rows in set (0.00 sec)master >SELECT *FROM fc2; +--- +------ + | m | n | +--- +------ + | 1 | 1 | | 2 | 2 | | 3 | 1 | +--- +------ + 3 rows in set (0.00 sec)slave >SELECT *FROM fc1; +--- +------ + | i | j | +--- +------ + | 1 | 1 | | 2 | 2 | +--- +------ + 2 rows in set (0.00 sec)slave >SELECT *FROM fc2; +--- +------ + | m | n | +--- +------ + | 1 | 1 | | 2 | 2 | | 3 | 1 | +--- +------ + 3 rows in set (0.00 sec)
现在,假设您DELETE
在主服务器上执行以下语句:
master >DELETE FROM fc1WHERE i=1; Query OK, 1 row affected (0.09 sec)
由于级联,fc2
现在主服务器上的表仅包含1行:
master >SELECT *FROM fc2; +--- +--- + | m | n | +--- +--- + | 2 | 2 | +--- +--- + 1 row in set (0.00 sec)
但是,级联不会在从属服务器上传播,因为DELETE
for fc1
不会在从属服务器上删除任何行fc2
。从属的副本fc2
仍包含最初插入的所有行:
slave >SELECT *FROM fc2; +--- +--- + | m | n | +--- +--- + | 1 | 1 | | 3 | 1 | | 2 | 2 | +--- +--- + 3 rows in set (0.00 sec)
这种差异是由于级联删除操作是由InnoDB
存储引擎在内部处理的事实所致,这意味着没有记录任何更改。