文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 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 參考手冊  /  ...  /  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 在副本上設定一個或多個複製篩選規則,其方式與使用複製篩選選項(例如 --replicate-do-db--replicate-wild-ignore-table)啟動副本 mysqld 的方式相同。 使用此陳述式設定的篩選器與使用伺服器選項設定的篩選器在兩個主要方面有所不同:

  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_DB:包含基於資料庫名稱的更新。相當於 --replicate-do-db

  • REPLICATE_IGNORE_DB:排除基於資料庫名稱的更新。相當於 --replicate-ignore-db

  • REPLICATE_DO_TABLE:包含基於表格名稱的更新。相當於 --replicate-do-table

  • REPLICATE_IGNORE_TABLE:排除基於表格名稱的更新。相當於 --replicate-ignore-table

  • REPLICATE_WILD_DO_TABLE:包含基於萬用字元模式比對表格名稱的更新。相當於 --replicate-wild-do-table

  • REPLICATE_WILD_IGNORE_TABLE:排除基於萬用字元模式比對表格名稱的更新。相當於 --replicate-wild-ignore-table

  • REPLICATE_REWRITE_DB:在複本上執行更新,方法是在複本上將來源上指定的資料庫替換為新名稱。相當於 --replicate-rewrite-db

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 = ();

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

RESET REPLICA ALL 語句會移除在該語句刪除的通道上設定的通道特定複製篩選器。當重新建立已刪除的通道時,會將為複本指定的任何全域複製篩選器複製到它們,並且不會套用任何通道特定的複製篩選器。

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