本節說明當存在多個複製通道時(例如在多來源複製拓撲中)如何使用複製篩選器。複製篩選器可以是全域的,也可以是特定於通道的,讓您能夠在特定複製通道上設定具有複製篩選器的多來源副本。當相同的資料庫或資料表存在於多個來源上,且副本只需要從一個來源複製時,通道特定的複製篩選器在多來源複製拓撲中特別有用。
如需設定複製通道的指示,請參閱第 19.1.5 節「MySQL 多來源複製」,如需它們如何運作的更多資訊,請參閱第 19.2.2 節「複製通道」。
多來源副本上的每個通道都必須從不同的來源複製。您不能設定從單一副本到單一來源的多個複製通道,即使您使用複製篩選器來選取每個通道上要複製的不同資料也一樣。這是因為副本的伺服器 ID 在複製拓撲中必須是唯一的。來源僅透過伺服器 ID 來區分副本,而不是透過複製通道的名稱來區分,因此它無法識別來自相同副本的不同複製通道。
在設定用於群組複製的 MySQL 伺服器執行個體上,通道特定的複製篩選器可以用於未直接參與群組複製的複製通道,例如群組成員也充當群組外部來源的副本的情況。它們不能用於 group_replication_applier
或 group_replication_recovery
通道。篩選這些通道會導致群組無法就一致狀態達成協議。
對於鑽石拓撲結構中的多來源複本(其中複本從兩個或多個來源複製,而這些來源又從共同來源複製),當使用基於 GTID 的複製時,請確保多來源複本上所有通道的任何複製篩選器或其他通道配置都是相同的。使用基於 GTID 的複製時,篩選器僅應用於交易資料,而 GTID 不會被篩選掉。這樣做的目的是為了使複本的 GTID 集與來源的保持一致,這表示可以使用 GTID 自動定位,而無需每次重新獲取篩選掉的交易。在下游複本為多來源並且從鑽石拓撲結構中的多個來源接收相同交易的情況下,下游複本現在具有該交易的多個版本,結果取決於哪個通道先應用該交易。嘗試應用該交易的第二個通道會使用 GTID 自動跳過,因為該交易的 GTID 已被第一個通道新增至 gtid_executed
集中。如果通道上的篩選是相同的,則不會有問題,因為該交易的所有版本都包含相同的資料,因此結果相同。但是,如果通道上的篩選不同,則資料庫可能會變得不一致,並且複製可能會掛起。
當存在多個複製通道時,例如在多來源複製拓撲中,複製篩選器的應用方式如下:
任何指定的全域複製篩選器都會新增至篩選器類型的全域複製篩選器(
do_db
、do_ignore_table
等)。任何通道特定的複製篩選器都會將該篩選器新增至指定通道的指定篩選器類型的複製篩選器。
如果未配置此類型的通道特定複製篩選器,則每個複製通道都會將全域複製篩選器複製到其通道特定的複製篩選器。
每個通道都會使用其通道特定的複製篩選器來篩選複製串流。
建立通道特定複製篩選器的語法擴展了現有的 SQL 陳述式和命令選項。當未指定複製通道時,會配置全域複製篩選器以確保向後相容性。CHANGE REPLICATION FILTER
陳述式支援 FOR CHANNEL
子句以在線上配置通道特定的篩選器。用於配置篩選器的 --replicate-*
命令選項可以使用 --replicate-
的格式來指定複製通道。假設伺服器啟動前存在通道 filter_type
=channel_name
:filter_details
channel_1
和 channel_2
;在這種情況下,使用命令列選項 --replicate-do-db=db1
--replicate-do-db=channel_1:db2
--replicate-do-db=db3
--replicate-ignore-db=db4
--replicate-ignore-db=channel_2:db5
--replicate-wild-do-table=channel_1:db6.t1%
啟動複本會導致:
全域複製篩選器:
do_db=db1,db3
;ignore_db=db4
channel_1 上的通道特定篩選器:
do_db=db2
;ignore_db=db4
;wild-do-table=db6.t1%
channel_2 上的通道特定篩選器:
do_db=db1,db3
;ignore_db=db5
在複本的 my.cnf
檔案中包含這些相同的規則時,可以在啟動時套用,如下所示:
replicate-do-db=db1
replicate-do-db=channel_1:db2
replicate-ignore-db=db4
replicate-ignore-db=channel_2:db5
replicate-wild-do-table=db6.channel_1.t1%
若要監控此設定中的複製篩選器,請使用 replication_applier_global_filters
和 replication_applier_filters
表格。
與複製篩選器相關的命令選項可以採用選用的 channel
,後接冒號,然後接篩選器規格。第一個冒號會被解讀為分隔符號,後續的冒號會被解讀為文字冒號。下列命令選項使用此格式支援通道特定的複製篩選器:
--replicate-do-db=
channel
:database_id
--replicate-ignore-db=
channel
:database_id
--replicate-do-table=
channel
:table_id
--replicate-ignore-table=
channel
:table_id
--replicate-rewrite-db=
channel
:db1-db2
--replicate-wild-do-table=
channel
:table
pattern
--replicate-wild-ignore-table=
channel
:table
pattern
剛才列出的所有選項都可以如同大多數其他 MySQL 伺服器啟動選項一樣,用於複本的 my.cnf
檔案中,方法是省略開頭的兩個破折號。請參閱複製篩選器和通道概述,取得簡短範例,以及第 6.2.2.2 節「使用選項檔案」。
如果您使用冒號但未指定篩選器選項的 channel
,例如 --replicate-do-db=:
,則該選項會針對預設複製通道配置複製篩選器。預設複製通道是複製啟動後一直存在的複製通道,並且與您手動建立的多來源複製通道不同。如果未指定冒號或 database_id
channel
,則該選項會配置全域複製篩選器,例如 --replicate-do-db=
會配置全域 database_id
--replicate-do-db
篩選器。
如果您使用相同的 from_name
資料庫配置多個 rewrite-db=
選項,則所有篩選器都會新增在一起(放入 from_name
->to_name
rewrite_do
清單中),並且第一個篩選器會生效。
用於 --replicate-wild-*-table
選項的 pattern
可以包含識別碼中允許的任何字元以及萬用字元 %
和 _
。這些的運作方式與使用 LIKE
運算子時相同;例如,tbl%
符合以 tbl
開頭的任何表格名稱,而 tbl_
符合與 tbl
加上一個額外字元相符的任何表格名稱。
除了 --replicate-*
選項之外,可以使用 CHANGE REPLICATION FILTER
陳述式配置複製篩選器。這樣就無需重新啟動伺服器,但是必須在進行變更時停止複製 SQL 執行緒。若要讓此陳述式將篩選器套用至特定通道,請使用 FOR CHANNEL
子句。例如:channel
CHANGE REPLICATION FILTER REPLICATE_DO_DB=(db1) FOR CHANNEL channel_1;
當提供 FOR CHANNEL
子句時,該陳述式會對指定通道的複製篩選器執行動作。如果指定多種類型的篩選器(do_db
、do_ignore_table
、wild_do_table
等),則陳述式僅會取代指定的篩選器類型。在具有多個通道的複製拓撲中,例如在多來源複本上,當未提供 FOR CHANNEL
子句時,該陳述式會使用與 FOR CHANNEL
情況類似的邏輯,對全域複製篩選器和所有通道的複製篩選器執行動作。如需更多資訊,請參閱第 15.4.2.1 節「CHANGE REPLICATION FILTER 陳述式」。
當已配置通道特定的複製篩選器時,您可以發出空的篩選器類型陳述式來移除篩選器。例如,若要從名為 channel_1
的複製通道移除所有 REPLICATE_REWRITE_DB
篩選器,請發出:
CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB=() FOR CHANNEL channel_1;
先前使用命令選項或 CHANGE REPLICATION FILTER
配置的任何 REPLICATE_REWRITE_DB
篩選器都會被移除。
RESET REPLICA ALL
陳述式會移除在陳述式刪除的通道上設定的通道特定複製篩選器。當重新建立已刪除的通道時,會將為複本指定的任何全域複製篩選器複製到這些通道,並且不會套用任何通道特定的複製篩選器。