文件首頁
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 參考手冊  /  ...  /  為基於 GTID 的複製佈建多來源複本

19.1.5.2 為基於 GTID 的複製佈建多來源複本

如果多來源複製拓撲中的來源具有現有資料,則在開始複製之前,使用相關資料佈建複本可以節省時間。在多來源複製拓撲中,無法使用複製或複製資料目錄來使用來自所有來源的資料佈建複本,您可能還只想從每個來源複製特定資料庫。因此,佈建此類複本的最佳策略是使用 mysqldump 在每個來源上建立適當的傾印檔案,然後使用 mysql 用戶端在複本上匯入傾印檔案。

如果您使用基於 GTID 的複製,則需要注意 mysqldump 放置在傾印輸出中的 SET @@GLOBAL.gtid_purged 陳述式。此陳述式會將在來源上執行的交易的 GTID 傳輸到複本,並且複本需要此資訊。但是,對於任何比從一個來源佈建一個新的、空的複本更複雜的情況,您需要檢查此陳述式在複本使用的 MySQL 版本中的影響,並相應地處理此陳述式。以下指南總結了合適的動作,但如需更多詳細資訊,請參閱 mysqldump 文件。

SET @@GLOBAL.gtid_purged 會將傾印檔案中的 GTID 集合新增至複本上現有的 gtid_purged 集合。因此,當您在複本上重播傾印檔案時,此陳述式可能會保留在傾印輸出中,並且傾印檔案可以在不同時間重播。但是,務必注意,mysqldump 針對 SET @@GLOBAL.gtid_purged 陳述式所包含的值,包括來源上 gtid_executed 集合中所有交易的 GTID,即使是那些變更資料庫中被抑制的部分,或伺服器上未包含在部分傾印中的其他資料庫的 GTID 亦是如此。如果您在複本上重播第二個或後續的傾印檔案,其中包含任何相同的 GTID(例如,來自相同來源的其他部分傾印,或來自另一個具有重疊交易的來源的傾印),則第二個傾印檔案中的任何 SET @@GLOBAL.gtid_purged 陳述式都會失敗,因此必須從傾印輸出中移除。

除了移除 SET @@GLOBAL.gtid_purged 陳述式之外,您也可以使用 mysqldump 以及 --set-gtid-purged=COMMENTED,將陳述式包含在 SQL 註解中,這樣在載入傾印檔案時就不會執行。如果您要使用來自相同來源的兩個部分傾印來佈建複本,而且第二個傾印中的 GTID 集合與第一個傾印相同(因此在傾印之間,來源上沒有執行新的交易),則在匯出第二個傾印檔案時,您可以改為設定 --set-gtid-purged=OFF,以省略該陳述式。

在下列佈建範例中,我們假設 SET @@GLOBAL.gtid_purged 陳述式不能保留在傾印輸出中,而且必須從檔案中移除並手動處理。我們也假設在佈建開始之前,複本上沒有包含 GTID 的任何所需交易。

  1. 若要在 source1 上為名為 db1 的資料庫以及在 source2 上為名為 db2 的資料庫建立傾印檔案,請對 source1 執行 mysqldump,如下所示

    mysqldump -u<user> -p<password> --single-transaction --triggers --routines --set-gtid-purged=ON --databases db1 > dumpM1.sql

    然後,對 source2 執行 mysqldump,如下所示

    mysqldump -u<user> -p<password> --single-transaction --triggers --routines --set-gtid-purged=ON --databases db2 > dumpM2.sql
  2. 記錄 mysqldump 新增到每個傾印檔案中的 gtid_purged 值。您可以像這樣擷取該值

    cat dumpM1.sql | grep GTID_PURGED | perl -p0 -e 's#/\*.*?\*/##sg' | cut -f2 -d'=' | cut -f2 -d$'\''
    cat dumpM2.sql | grep GTID_PURGED | perl -p0 -e 's#/\*.*?\*/##sg' | cut -f2 -d'=' | cut -f2 -d$'\''

    在每種情況下,結果都應該是一個 GTID 集合,例如

    source1:   2174B383-5441-11E8-B90A-C80AA9429562:1-1029
    source2:   224DA167-0C0C-11E8-8442-00059A3C7B00:1-2695
  3. 從每個傾印檔案中移除包含 SET @@GLOBAL.gtid_purged 陳述式的行。例如

    sed '/GTID_PURGED/d' dumpM1.sql > dumpM1_nopurge.sql
    sed '/GTID_PURGED/d' dumpM2.sql > dumpM2_nopurge.sql
  4. 使用 mysql 用戶端將每個編輯過的傾印檔案匯入複本。例如

    mysql -u<user> -p<password> < dumpM1_nopurge.sql
    mysql -u<user> -p<password> < dumpM2_nopurge.sql
  5. 在複本上,發出 RESET BINARY LOGS AND GTIDS 來清除 GTID 執行歷程記錄(假設如上所述,所有傾印檔案都已匯入,並且複本上沒有包含 GTID 的任何所需交易)。然後,發出 SET @@GLOBAL.gtid_purged 陳述式,將 gtid_purged 值設定為所有傾印檔案中所有 GTID 集合的聯集,如您在步驟 2 中記錄的那樣。例如

    mysql> RESET BINARY LOGS AND GTIDS;
    mysql> SET @@GLOBAL.gtid_purged = "2174B383-5441-11E8-B90A-C80AA9429562:1-1029, 224DA167-0C0C-11E8-8442-00059A3C7B00:1-2695";

    如果傾印檔案中的 GTID 集合之間有或可能會有重疊的交易,您可以使用第 19.1.3.8 節「用來操作 GTID 的儲存函數範例」中描述的儲存函數預先檢查此情況,並計算所有 GTID 集合的聯集。