可以採用這種方式使用複製:複本上的儲存引擎與來源上的儲存引擎不同。例如,您可以將來源上 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
儲存引擎在內部處理的,這意味著任何變更都不會被記錄下來。