如果您使用資料庫層級與資料表層級複製篩選選項的組合,副本會先使用資料庫選項接受或忽略事件,然後它會根據資料表選項評估這些選項允許的所有事件。這有時會導致看起來違反直覺的結果。同樣重要的是要注意,結果會因操作是否使用基於陳述式或基於列的二進制日誌格式記錄而有所不同。如果您想要確保您的複製篩選器始終以相同的方式運作,而與二進制日誌格式無關,這在您使用混合二進制日誌格式時尤其重要,請遵循本主題中的指南。
由於資料庫名稱的識別方式不同,二進位日誌格式會影響複寫篩選選項的效果。使用語句式格式時,DML 語句會根據目前資料庫(由 USE
語句指定)來處理。使用資料列式格式時,DML 語句會根據修改後的資料表所在的資料庫來處理。DDL 語句一律根據目前資料庫(由 USE
語句指定)來篩選,無論二進位日誌格式為何。
涉及多個資料表的操作也可能因二進位日誌格式而受到複寫篩選選項的不同影響。需要注意的操作包括:涉及多資料表 UPDATE
語句的交易、觸發器、串聯式外部索引鍵、更新多個資料表的預存函式,以及呼叫更新一個或多個資料表的預存函式的 DML 語句。如果這些操作更新了篩選包含和篩選排除的資料表,則結果可能會因二進位日誌格式而有所不同。
如果您需要確保複寫篩選器的運作方式一致(無論二進位日誌格式為何),尤其是當您使用混合二進位日誌格式 (binlog_format=MIXED
) 時,請僅使用資料表層級的複寫篩選選項,而不要使用資料庫層級的複寫篩選選項。此外,請勿使用更新篩選包含和篩選排除資料表的多資料表 DML 語句。
如果您需要結合使用資料庫層級和資料表層級的複寫篩選器,並希望這些篩選器盡可能一致地運作,請選擇下列其中一種策略:
如果您使用資料列式二進位日誌格式 (
binlog_format=ROW
),對於 DDL 語句,請依賴USE
語句來設定資料庫,而不要指定資料庫名稱。您可以考慮變更為資料列式二進位日誌格式,以改善複寫篩選的一致性。如需有關變更二進位日誌格式的適用條件,請參閱第 7.4.4.2 節「設定二進位日誌格式」。如果您使用語句式或混合式二進位日誌格式 (
binlog_format=STATEMENT
或MIXED
),對於 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 TABLE
會在 db1
中建立資料表,如同先前 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
),則複本會使用預設資料庫 (由USE
語句設定為db1
,且未變更) 來評估INSERT
操作。根據其資料庫層級選項--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
語句。無論操作以語句式或資料列式二進位格式記錄,結果都保持不變。