文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  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 儲存引擎內部處理的,這表示沒有任何變更被記錄下來。