本節說明當存在多個複製通道時(例如在多來源複製拓樸中)如何使用複製過濾器。複製過濾器可以是全域的或特定於通道的,使您能夠在特定複製通道上使用複製過濾器來設定多來源副本。當相同的資料庫或表格存在於多個來源上,且副本僅需要從一個來源複製時,特定於通道的複製過濾器在多來源複製拓樸中特別有用。
如需設定複製通道的說明,請參閱章節 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
陳述式會移除在陳述式刪除的通道上設定的通道特定複製篩選器。當重新建立已刪除的通道時,指定給副本的任何全域複製篩選器都會被複製到這些通道中,且不會套用任何通道特定複製篩選器。