文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信紙尺寸) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  InnoDB 儲存引擎  /  InnoDB 和 MySQL 複製

17.19 InnoDB 和 MySQL 複製

可以採用這種方式使用複製:複本上的儲存引擎與來源上的儲存引擎不同。例如,您可以將來源上 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)

然而,連鎖刪除不會傳播到複本,因為在複本上,針對 fc1DELETE 不會從 fc2 中刪除任何列。複本的 fc2 副本仍然包含最初插入的所有列。

replica> SELECT * FROM fc2;
+---+---+
| m | n |
+---+---+
| 1 | 1 |
| 3 | 1 |
| 2 | 2 |
+---+---+
3 rows in set (0.00 sec)

這種差異的原因是連鎖刪除是由 InnoDB 儲存引擎在內部處理的,這意味著任何變更都不會被記錄下來。