MySQL 8.0版本说明
MySQL 8.0源代码文档10bet官方网站
可以在副本上的存储引擎与源上的存储引擎不相同的情况下使用复制。例如,您可以将修改复制到InnoDB
表源上的一个MyISAM
副本上的表。更多信息请参见,第17.4.4节“使用不同源和复制存储引擎的复制”.
有关设置副本的信息,请参见第17.1.2.6节“设置副本”,第17.1.2.5节“选择数据快照的方法”.要在不删除源文件或现有副本的情况下生成新的副本,请使用MySQL企业备份产品。
在源上失败的事务不会影响复制。MySQL复制基于二进制日志,MySQL在其中写入修改数据的SQL语句。失败的事务(例如,由于违反外键或由于回滚)不会写入二进制日志,因此不会发送到副本。看到第13.3.1节“启动事务、提交和回滚语句”.
复制和级联。级联行动InnoDB
源上的表在副本上执行只有如果共享外键关系的表使用InnoDB
在源和副本上。无论您使用的是基于语句的复制还是基于行的复制,都是如此。假设您已经开始复制,然后在源上创建两个表,其中InnoDB
定义为默认存储引擎,使用以下创建表
声明:
创建表fc1 (i INT主键,j INT);CREATE TABLE fc2 (m INT主键,n INT外键,ni (n)引用fc1 (i) ON DELETE CASCADE);
如果副本具有MyISAM
定义为默认存储引擎,在副本上创建相同的表,但是它们使用MyISAM
存储引擎,和外键
选项被忽略。现在我们在源文件的表中插入一些行:
source> INSERT INTO fc1 VALUES (1,1), (2,2);查询OK, 2 rows affected (0.09 sec) Records: 2 duplicate: 0 warning: 0 source> INSERT INTO fc2 VALUES (1,1), (2,2), (3,1);查询OK, 3 row affected (0.19 sec) Records: 3 duplicate: 0 warning: 0
此时,在源和副本上都有表fc1
包含2行和表fc2
包含3行,如下所示:
source> SELECT * FROM fc1;+---+------+ | 我| j | +---+------+ | 1 | 1 | | 2 | 2 | +---+------+ 2行集(0.00秒)源> SELECT * FROM fc2;+---+------+ | m | n | +---+------+ | 1 | 1 | | 2 | 2 | | 3 | 1 | +---+------+ 3行集(0.00秒)副本> SELECT * FROM fc1;+---+------+ | 我| j | +---+------+ | 1 | 1 | | 2 | 2 | +---+------+ 2行集(0.00秒)副本> SELECT * FROM fc2;+---+------+ | m | n | +---+------+ | 1 | 1 | | 2 | 2 | | 3 | 1 | +---+------+ 3行集(0.00秒)
现在假设您执行以下操作删除
关于来源的声明:
删除fc1中的i=1;查询OK, 1行受影响(0.09秒)
由于级联,表fc2
在源文件中现在只包含一行:
source> SELECT * FROM fc2;+---+---+ | m | n | +---+---+ | 2 | 2 | +---+---+ 1行集(0.00秒)
但是,级联不会在副本上传播,因为在副本上删除
为fc1
中不删除任何行fc2
.复制品的复制品fc2
仍然包含最初插入的所有行:
复制> SELECT * FROM fc2;+---+---+ | m | n | +---+---+ | 1 | 1 | | 3 | 1 | | 2 | 2 | +---+---+ 3行集(0.00秒)
的内部处理级联删除是造成这种差异的原因InnoDB
存储引擎,这意味着没有任何更改被记录下来。