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

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

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

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

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

作為移除 SET @@GLOBAL.gtid_purged 陳述式的替代方案,您可以使用 mysqldump,並加上 --set-gtid-purged=COMMENTED 選項,將該陳述式以 SQL 註解包覆,這樣在載入 dump 檔案時就不會執行它。如果您使用來自同一個來源的兩個部分 dump 來佈建複本,且第二個 dump 中的 GTID 集合與第一個相同(表示在 dump 之間來源上沒有執行新的交易),您可以在匯出第二個 dump 檔案時改為設定 --set-gtid-purged=OFF 來省略該陳述式。

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

  1. 若要為 source1 上的名為 db1 的資料庫,以及 source2 上的名為 db2 的資料庫建立 dump 檔案,請依下列方式針對 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. 記錄 gtid_purged 值,該值由 mysqldump 新增到每個 dump 檔案中。您可以使用以下方式提取該值:

    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. 從每個 dump 檔案中移除包含 SET @@GLOBAL.gtid_purged 陳述式的行。例如:

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

    mysql -u<user> -p<password> < dumpM1_nopurge.sql
    mysql -u<user> -p<password> < dumpM2_nopurge.sql
  5. 在複本上,發出 RESET BINARY LOGS AND GTIDS 來清除 GTID 執行歷史記錄(如上所述,假設所有 dump 檔案都已匯入,且複本上沒有任何具有 GTID 的所需交易)。然後發出 SET @@GLOBAL.gtid_purged 陳述式,將 gtid_purged 值設定為來自所有 dump 檔案的所有 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";

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