文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 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 參考手冊  /  ...  /  複製篩選選項之間的互動

19.2.5.3 複製篩選選項之間的互動

如果您使用資料庫層級和表格層級複製篩選選項的組合,複本會先使用資料庫選項接受或忽略事件,然後根據表格選項評估這些選項允許的所有事件。這有時會導致看似違反直覺的結果。同樣重要的是要注意,結果會根據作業是使用基於陳述式還是基於列的二進位記錄格式來記錄而有所不同。如果您想確保複製篩選器始終以相同的方式運作,而不受二進位記錄格式的影響,這在您使用混合二進位記錄格式時尤其重要,請遵循本主題中的指導。

複製篩選選項的效果在二進位記錄格式之間有所不同,因為資料庫名稱的識別方式不同。對於基於陳述式的格式,DML 陳述式會根據目前的資料庫來處理,如 USE 陳述式所指定。對於基於列的格式,DML 陳述式會根據修改過的表格所在的資料庫來處理。DDL 陳述式始終會根據目前的資料庫來篩選,如 USE 陳述式所指定,無論二進位記錄格式為何。

涉及多個表格的操作也可能會因二進位記錄格式的不同而受到複製篩選選項的不同影響。需要注意的操作包括涉及多表格 UPDATE 陳述式的交易、觸發程序、串聯外部索引鍵、更新多個表格的儲存函式,以及呼叫更新一個或多個表格的儲存函式的 DML 陳述式。如果這些操作同時更新了篩選納入和篩選排除的表格,則結果可能會因二進位記錄格式的不同而有所差異。

如果您需要保證複製篩選器能夠一致地運作,而不受二進位記錄格式的影響,特別是當您使用混合二進位記錄格式 (binlog_format=MIXED) 時,請僅使用表格層級的複製篩選選項,而不要使用資料庫層級的複製篩選選項。此外,請勿使用同時更新篩選納入和篩選排除表格的多表格 DML 陳述式。

如果您需要使用資料庫層級和表格層級複製篩選器的組合,並希望這些篩選器盡可能一致地運作,請選擇下列其中一種策略

  1. 如果您使用基於列的二進位記錄格式 (binlog_format=ROW),對於 DDL 陳述式,請依賴 USE 陳述式來設定資料庫,而不要指定資料庫名稱。您可以考慮變更為基於列的二進位記錄格式,以提高複製篩選的一致性。請參閱 第 7.4.4.2 節,"設定二進位日誌格式",了解適用於變更二進位記錄格式的條件。

  2. 如果您使用基於語句或混合的二進制日誌格式(binlog_format=STATEMENTMIXED),對於 DML 和 DDL 語句,請依賴 USE 語句,並且不要使用資料庫名稱。此外,請勿使用會更新已篩選和未篩選資料表的跨資料表 DML 語句。

範例 19.7:--replicate-ignore-db 選項和 --replicate-do-table 選項

在複製來源伺服器上,發出以下語句:

USE db1;
CREATE TABLE t2 LIKE t1;
INSERT INTO db2.t3 VALUES (1);

副本設定了以下複製篩選選項:

replicate-ignore-db = db1
replicate-do-table = db2.t3

DDL 語句 CREATE TABLEdb1 中建立資料表,如先前的 USE 語句所指定。副本會根據其 --replicate-ignore-db = db1 選項篩選掉此語句,因為 db1 是目前的資料庫。無論複製來源伺服器上的二進制日誌格式為何,此結果都相同。但是,DML INSERT 語句的結果會因二進制日誌格式而異。

  • 如果來源上使用基於列的二進制日誌格式(binlog_format=ROW),則副本會使用資料表存在的資料庫(命名為 db2)來評估 INSERT 操作。因此,首先評估的資料庫層級選項 --replicate-ignore-db = db1 不會適用。資料表層級選項 --replicate-do-table = db2.t3 確實適用,因此副本會將變更套用至資料表 t3

  • 如果來源上使用基於語句的二進制日誌格式(binlog_format=STATEMENT),則副本會使用預設資料庫來評估 INSERT 操作,該預設資料庫由 USE 語句設定為 db1 且未變更。根據其資料庫層級選項 --replicate-ignore-db = db1,因此它會忽略該操作,並且不會將變更套用至資料表 t3。不會檢查資料表層級選項 --replicate-do-table = db2.t3,因為該語句已符合資料庫層級選項並已忽略。

如果副本上的 --replicate-ignore-db = db1 選項是必要的,並且來源上使用基於語句(或混合)的二進制日誌格式也是必要的,則可以透過從 INSERT 語句中省略資料庫名稱,並依賴 USE 語句,來使結果保持一致,如下所示:

USE db1;
CREATE TABLE t2 LIKE t1;
USE db2;
INSERT INTO t3 VALUES (1);

在這種情況下,副本始終會根據資料庫 db2 來評估 INSERT 語句。無論操作是以基於語句還是基於列的二進制格式記錄,結果都保持不變。