14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制:
MySQL 复制工作对于InnoDB 表和对于MyISAM表。
它是可能使用复制的方式 存储引擎在slave上和在master上的原始引擎是不一样的。
比如,你可以复制在master上的InnoDB表的修改到slave的MyISAM table on the slave.
设置一个新的slave对于master, 做一份InnoDB表空间和log files的拷贝,
以及InnoDB 表的.frm文件, 移动到slave.
如果 innodb_file_per_table 选项是启用的, 也复制.ibd文件。
做一个新的slave 在不关闭master或者基于一个存在的slave,
使用 MySQL Enterprise Backup product.
如果你能关闭master 或者一个存在的slave, 做一个InnoDB tablespaces和log files的冷备份
使用那个来设置一个slave.
事务如果在master上失败 根本不会影响复制。
MySQL 复制是基于Binary log ,MySQL 写SQL语句(修改数据)
如果一个事务失败(比如,外键约束或者回滚)时不会写到binary log,
因此不会发送到slave.
复制和级联,Cascading 操作对于InnoDB 表在master 是复制到slave只有当表共享外键关系
使用InnoDB 在master和slave上。
这是对的当你使用基于语句或者基于行的复制。
假设你已经启动复制,那么创建2个表在master使用下面的SQL语句:
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;
假设slave不支持InnoDB,如果这样的话, 那么表在slave上也会创建,
但是使用MyISAM 存储引擎,然后FOREIGN KEY被忽略。
现在我们插入一些记录到master的表上
master> INSERT INTO fc1 VALUES (1, 1), (2, 2);
Query OK, 2 rows affected (0.09 sec)
Records: 2 Duplicates: 0 Warnings: 0
master> INSERT INTO fc2 VALUES (1, 1), (2, 2), (3, 1);
Query OK, 3 rows affected (0.19 sec)
Records: 3 Duplicates: 0 Warnings: 0
在这点上,master和slave 表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)