在複製中,複本上的儲存引擎可以與來源上的儲存引擎不同。例如,您可以將來源上 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 和 ROLLBACK 陳述式」。
複製與 CASCADE。 只有在來源和副本上共用外鍵關係的資料表都使用 InnoDB
時,來源上 InnoDB
資料表的級聯動作才會在副本上執行。無論您使用的是基於語句的複製還是基於列的複製,情況都是如此。假設您已啟動複製,然後在來源上建立兩個資料表,其中 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)
由於級聯,來源上的資料表 fc2
現在只包含 1 列
source> SELECT * FROM fc2;
+---+---+
| m | n |
+---+---+
| 2 | 2 |
+---+---+
1 row in set (0.00 sec)
但是,級聯不會在副本上傳播,因為在副本上針對 fc1
的 DELETE
不會從 fc2
中刪除任何列。副本的 fc2
副本仍然包含最初插入的所有列
replica> SELECT * FROM fc2;
+---+---+
| m | n |
+---+---+
| 1 | 1 |
| 3 | 1 |
| 2 | 2 |
+---+---+
3 rows in set (0.00 sec)
這種差異是由於級聯刪除是由 InnoDB
儲存引擎內部處理的,這表示沒有任何變更被記錄下來。