文件首頁
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 參考手冊  /  ...  /  CHANGE REPLICATION FILTER 陳述式

15.4.2.1 CHANGE REPLICATION FILTER 陳述式

CHANGE REPLICATION FILTER filter[, filter]
	[, ...] [FOR CHANNEL channel]

filter: {
    REPLICATE_DO_DB = (db_list)
  | REPLICATE_IGNORE_DB = (db_list)
  | REPLICATE_DO_TABLE = (tbl_list)
  | REPLICATE_IGNORE_TABLE = (tbl_list)
  | REPLICATE_WILD_DO_TABLE = (wild_tbl_list)
  | REPLICATE_WILD_IGNORE_TABLE = (wild_tbl_list)
  | REPLICATE_REWRITE_DB = (db_pair_list)
}

db_list:
    db_name[, db_name][, ...]

tbl_list:
    db_name.table_name[, db_name.table_name][, ...]
wild_tbl_list:
    'db_pattern.table_pattern'[, 'db_pattern.table_pattern'][, ...]

db_pair_list:
    (db_pair)[, (db_pair)][, ...]

db_pair:
    from_db, to_db

CHANGE REPLICATION FILTER 以與啟動副本 mysqld 時相同的方式,在副本上設定一或多個複製篩選規則,如同使用複製篩選選項(例如 --replicate-do-db--replicate-wild-ignore-table)。使用此陳述式設定的篩選器與使用伺服器選項設定的篩選器在兩個關鍵方面有所不同:

  1. 該陳述式不需要重新啟動伺服器即可生效,只需要先使用 STOP REPLICA SQL_THREAD 停止複製 SQL 執行緒(然後使用 START REPLICA SQL_THREAD 重新啟動)。

  2. 該陳述式的效果不持久;使用 CHANGE REPLICATION FILTER 設定的任何篩選器在重新啟動副本 mysqld 後都會遺失。

CHANGE REPLICATION FILTER 需要 REPLICATION_SLAVE_ADMIN 權限(或已棄用的 SUPER 權限)。

使用 FOR CHANNEL channel 子句可以使複製篩選器特定於複製通道,例如在多來源副本上。在沒有特定 FOR CHANNEL 子句的情況下套用的篩選器被視為全域篩選器,這表示它們會套用於所有複製通道。

注意

全域複製篩選器無法在設定為群組複製的 MySQL 伺服器執行個體上設定,因為在某些伺服器上篩選交易會使群組無法就一致的狀態達成協議。通道特定的複製篩選器可以設定在未直接參與群組複製的複製通道上,例如,群組成員也充當群組外部來源的副本。它們不能設定在 group_replication_appliergroup_replication_recovery 通道上。

以下列表顯示 CHANGE REPLICATION FILTER 選項及其與 --replicate-* 伺服器選項的關係:

REPLICATE_DO_DBREPLICATE_IGNORE_DB 篩選器的確切效果取決於是否正在使用基於陳述式或基於列的複製。如需詳細資訊,請參閱 第 19.2.5 節,「伺服器如何評估複製篩選規則」

可以在單一 CHANGE REPLICATION FILTER 陳述式中建立多個複製篩選規則,方法是以逗號分隔規則,如下所示:

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (d1), REPLICATE_IGNORE_DB = (d2);

發出剛才顯示的陳述式相當於使用選項 --replicate-do-db=d1 --replicate-ignore-db=d2 啟動副本 mysqld

在多來源副本上,該副本使用多個複製通道來處理來自不同來源的交易,使用 FOR CHANNEL channel 子句在複製通道上設定複製篩選器:

CHANGE REPLICATION FILTER REPLICATE_DO_DB = (d1) FOR CHANNEL channel_1;

這使您可以建立通道特定的複製篩選器,以篩選出所選來源的資料。當提供 FOR CHANNEL 子句時,複製篩選器陳述式會作用於該複製通道,移除具有與指定複製篩選器相同篩選器類型的任何現有複製篩選器,並以指定的篩選器取代它們。陳述式中未明確列出的篩選器類型不會修改。如果針對未設定的複製通道發出此陳述式,則陳述式會失敗並顯示 ER_SLAVE_CONFIGURATION 錯誤。如果針對群組複製通道發出此陳述式,則陳述式會失敗並顯示 ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED 錯誤。

在設定了多個複製通道的副本上,發出沒有 FOR CHANNEL 子句的 CHANGE REPLICATION FILTER 會設定每個已設定複製通道和全域複製篩選器的複製篩選器。對於每種類型的篩選器,如果陳述式中列出了篩選器類型,則該類型任何現有的篩選規則都會被最近發出的陳述式中指定的篩選規則取代,否則會保留篩選器類型的舊值。如需詳細資訊,請參閱 第 19.2.5.4 節,「基於複製通道的篩選器」

如果多次指定相同的篩選規則,則實際上只會使用最後一個此類規則。例如,此處顯示的兩個陳述式具有完全相同的效果,因為第一個陳述式中的第一個 REPLICATE_DO_DB 規則會被忽略:

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db1, db2), REPLICATE_DO_DB = (db3, db4);

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db3, db4);
注意

此行為與 --replicate-* 篩選器選項的行為不同,後者多次指定相同的選項會導致建立多個篩選規則。

不包含任何特殊字元的表格和資料庫名稱不需要加上引號。與 REPLICATION_WILD_TABLEREPLICATION_WILD_IGNORE_TABLE 搭配使用的值是字串表達式,可能包含(特殊的)萬用字元,因此必須加上引號。這在以下範例陳述式中顯示:

CHANGE REPLICATION FILTER
    REPLICATE_WILD_DO_TABLE = ('db1.old%');

CHANGE REPLICATION FILTER
    REPLICATE_WILD_IGNORE_TABLE = ('db1.new%', 'db2.new%');

REPLICATE_REWRITE_DB 搭配使用的值表示資料庫名稱的配對;每個此類值必須以括號括住。以下陳述式將來源上資料庫 db1 中發生的陳述式重新寫入副本上的資料庫 db2

CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((db1, db2));

剛才顯示的陳述式包含兩組括號,一組括住資料庫名稱的配對,另一組括住整個清單。在以下範例中,這或許更容易理解,該範例建立了兩個 rewrite-db 規則,一個將資料庫 dbA 重新寫入為 dbB,另一個將資料庫 dbC 重新寫入為 dbD

CHANGE REPLICATION FILTER
  REPLICATE_REWRITE_DB = ((dbA, dbB), (dbC, dbD));

CHANGE REPLICATION FILTER 陳述式僅取代受陳述式影響的篩選器類型和複製通道的複製篩選規則,並保持其他規則和通道不變。如果您想要取消設定指定類型的所有篩選器,請將篩選器的值設定為明確的空清單,如本範例所示,該範例會移除所有現有的 REPLICATE_DO_DBREPLICATE_IGNORE_DB 規則:

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();

以這種方式將篩選器設定為空白會移除所有現有的規則,不會建立任何新的規則,也不會還原使用命令列或組態檔中的 --replicate-* 選項在 mysqld 啟動時設定的任何規則。

RESET REPLICA ALL 陳述式會移除在陳述式刪除的通道上設定的通道特定複製篩選器。當重新建立已刪除的通道時,會將為副本指定的任何全域複製篩選器複製到這些通道,並且不套用任何通道特定的複製篩選器。

如需詳細資訊,請參閱 第 19.2.5 節,「伺服器如何評估複製篩選規則」