使用開放原始碼工具將「適用於 MySQL 的 Azure 資料庫 - 單一伺服器」移轉至「適用於 MySQL 的 Azure 資料庫 - 彈性伺服器」
您可以使用 mydumper/myloader 和資料輸入複寫等開放原始碼工具的組合,將「適用於 MySQL 的 Azure 資料庫 - 單一伺服器」的執行個體移轉至「適用於 MySQL 的 Azure 資料庫 - 彈性伺服器」,並將停機時間降到最低。
注意
本文包含「從屬」一詞的參考,Microsoft 已不再使用該字詞。 從軟體中移除該字詞時,我們也會將其從本文中移除。
資料輸入複寫是一種技術,可根據二進位記錄檔位置方法,將資料變更從來源伺服器複寫到目的地伺服器。 在此情節中,做為來源 (資料庫變更的來源) 的 MySQL 執行個體,會將更新和變更以「事件」的形式寫入到二進位記錄。 二進位記錄中的資訊會根據所記錄的資料庫變更,以不同的記錄格式儲存。 複本會設定為從來源讀取二進位記錄,並執行複本的本機資料庫中二進位符號中的事件。
如果您設定資料輸入複寫以將資料從某個適用於 MySQL 的 Azure 資料庫執行個體同步處理到另一個執行個體,則可以從主要 (或來源資料庫) 對複本 (或目標資料庫) 執行應用程式的選擇性完全移轉。
在本教學課程中,您將使用 mydumper/myloader 和資料輸入複寫,將範例資料庫 (classicmodels) 從適用於 MySQL 的 Azure 資料庫 - 單一伺服器的執行個體移轉至適用於 MySQL 的 Azure 資料庫 - 彈性伺服器的執行個體,然後同步處理資料。
在本教學課程中,您會了解如何:
- 針對不同案例的資料輸入複寫設定網路設定。
- 設定主要與複本之間的資料輸入複寫。
- 測試複寫。
- 完全移轉以完成移轉。
必要條件
若要完成本教學課程,您需要:
執行 5.7 或 8.0 版的適用於 MySQL 的 Azure 資料庫單一伺服器執行個體。
注意
如果您執行的是適用於 MySQL 的 Azure 資料庫單一伺服器 5.6 版,請將您的執行個體升級至 5.7 版,然後設定複寫中的資料。 若要深入了解,請參閱適用於 MySQL 的 Azure 資料庫 - 單一伺服器的主要版本升級。
適用於 MySQL 的 Azure 資料庫彈性伺服器的執行個體。 如需詳細資訊,請參閱在適用於 MySQL 的 Azure 資料庫彈性伺服器中建立執行個體一文。
注意
不支援為區域備援高可用性伺服器設定資料輸入複寫。 如果您想要讓目標伺服器有區域備援 HA,請執行下列步驟:
- 建立已啟用區域備援 HA 的伺服器
- 停用 HA
- 請遵循文章來設定資料輸入複寫
- 完全移轉後移除資料輸入複寫組態
- 啟用 HA
請確定來源和目標伺服器上的 GTID_Mode 具有相同設定。
若要使用 MySQL Workbench 連線及建立資料庫。 如需詳細資訊,請參閱使用 MySQL Workbench 連線和查詢資料一文。
確保您在相同區域 (或具有私人存取的相同 VNet) 中有執行 Linux 的 Azure VM,裝載您的來源和目標資料庫。
在您的 Azure VM 上安裝 mysql 用戶端或 MySQL Workbench (用戶端工具)。 請確定您可以同時連線到主要和複本伺服器。 針對本文的目的,會安裝 mysql 用戶端。
在 Azure VM 上安裝 mydumper/myloader。 如需詳細資訊,請參閱 mydumper/myloader 一文。
在來源伺服器上下載並執行 classicmodels 資料庫的範例資料庫指令碼。
在 來源伺服器上設定binlog_expire_logs_seconds ,以確保在複本認可變更之前,不會清除 binlog。 成功完全移轉後,您可以重設此值。
設定網路需求
若要設定資料輸入複寫,您必須確定目標可以透過連接埠 3306 連線到來源。 根據來源上設定的端點類型,執行下列的適當步驟。
- 如果來源上已啟用公用端點,請確定目標可以透過在防火牆規則中啟用「允許存取 Azure 服務」來連線到來源。 若要深入了解,請參閱防火牆規則 - 適用於 MySQL 的 Azure 資料庫。
- 如果來源上已啟用私人端點和「拒絕公用存取」,請在裝載目標的相同 VNet 中安裝私人連結。 若要深入了解,請參閱私人連結 - 適用於 MySQL 的 Azure 資料庫。
設定資料輸入複寫
若要設定資料輸入複寫,請執行下列步驟:
登入您安裝 mysql 用戶端工具的 Azure VM。
使用 mysql 用戶端工具連線來源和目標。
使用 mysql 用戶端工具,執行下列命令來判斷來源上是否啟用 log_bin:
SHOW VARIABLES LIKE 'log_bin';
注意
使用具有大型儲存體的適用於 MySQL 的 Azure 資料庫單一伺服器,最多可支援 16TB 且預設為啟用。
提示
適用於 MySQL 的 Azure 資料庫單一伺服器,最多可支援 4TB 且預設不會啟用。 不過,如果您升級來源伺服器的讀取複本,然後刪除讀取複本,參數將會設定為「開啟」。
根據來源伺服器的 SSL 強制執行,藉由執行適當的命令,在來源伺服器中建立具有複寫權限的使用者。
如果您使用 SSL,請執行下列命令:
CREATE USER 'syncuser'@'%' IDENTIFIED BY 'yourpassword'; GRANT REPLICATION SLAVE ON *.* TO ' syncuser'@'%' REQUIRE SSL;
如果您不是使用 SSL,請執行下列命令:
CREATE USER 'syncuser'@'%' IDENTIFIED BY 'yourpassword'; GRANT REPLICATION SLAVE ON *.* TO ' syncuser'@'%';
若要使用 mydumper 備份資料庫,請在安裝 mydumper\myloader 的 Azure VM 上執行下列命令:
mydumper --host=<primary_server>.mysql.database.azure.com --user=<username>@<primary_server> --password=<Password> --outputdir=./backup --rows=100000 -G -E -R -z --trx-consistency-only --compress --build-empty-files --threads=16 --compress-protocol --ssl --regex '^(classicmodels\.)' -L mydumper-logs.txt
提示
--trx-consistency-only 選項是進行備份時交易一致性的必要選項。
- mydumper 相當於 mysqldump 的 --single-transaction。
- 如果您的資料表都是 InnoDB,則很有用。
- 「主要」執行緒只需要保留全域鎖定,直到「傾印」執行緒可以啟動交易為止。
- 提供全域鎖定的最短持續時間
「主要」執行緒只需要保留全域鎖定,直到「傾印」執行緒可以啟動交易為止。
此命令中的變數如下所述:
HOW-TO-MANAGE-FIREWALL-PORTAL --host:主要伺服器的名稱
- --user:使用者的名稱 (格式為 username@servername,因為主要伺服器是執行適用於 MySQL 的 Azure 資料庫 - 單一伺服器)。 您可以使用伺服器管理員或具有 SELECT 和 RELOAD 權限的使用者。
- --Password:上述使用者的密碼
如需使用 mydumper 的詳細資訊,請參閱 mydumper/myloader
執行下列命令來讀取中繼資料檔案,以判斷二進位記錄檔名稱和位移:
cat ./backup/metadata
在此命令中,./backup 是指上一個步驟中命令中使用的輸出目錄。
結果應該會顯示如下圖所示:
請務必記下二進位檔案名稱,以便於在後續步驟中使用。
執行下列命令以使用 myloader 還原資料庫:
myloader --host=<servername>.mysql.database.azure.com --user=<username> --password=<Password> --directory=./backup --queries-per-transaction=100 --threads=16 --compress-protocol --ssl --verbose=3 -e 2>myloader-logs.txt
此命令中的變數如下所述:
- --host:複本伺服器的名稱
- --user:使用者的名稱。 您可以使用伺服器管理員或具有可將結構描述和資料還原至資料庫的讀取\寫入權限使用者
- --Password:上述使用者的密碼
根據主要伺服器上的 SSL 強制執行,使用 mysql 用戶端工具連線到複本伺服器,然後執行下列步驟。
如果已啟用 SSL 強制執行,則:
i. 在這裡下載透過 SSL 與「適用於 MySQL 的 Azure 資料庫」伺服器通訊所需的憑證。
ii. 在記事本中開啟檔案,並將內容貼到「在這裡放置公鑰憑證的內容」一節。
SET @cert = '-----BEGIN CERTIFICATE----- PLACE YOUR PUBLIC KEY CERTIFICATE'S CONTEXT HERE -----END CERTIFICATE-----'
iii. 若要設定複寫中的資料,請執行下列命令:
CALL mysql.az_replication_change_master('<Primary_server>.mysql.database.azure.com', '<username>@<primary_server>', '<Password>', 3306, '<File_Name>', <Position>, @cert);
注意
從步驟 6 中取得的資訊判斷位置和檔案名稱。
如果未啟用 SSL 強制執行,請執行下列命令:
CALL mysql.az_replication_change_master('<Primary_server>.mysql.database.azure.com', '<username>@<primary_server>', '<Password>', 3306, '<File_Name>', <Position>, '');
若要從複本伺服器開始複寫,請呼叫下列預存程序。
call mysql.az_replication_start;
若要檢查複寫狀態,請在複本伺服器上執行下列命令:
show slave status \G;
注意
如果您使用 MySQL Workbench,則不需要 \G 修飾元。
如果 Slave_IO_Running 和 Slave_SQL_Running 的狀態為「是」,且 Seconds_Behind_Master 的值為 0,則複寫可以運作良好。 Seconds_Behind_Master 會指出複本的延遲時間。 如果值為 0 以外的值,則複本正在處理更新。
測試複寫 (選擇性)
若要確認資料輸入複寫是否正常運作,您可以確認主要中資料表的變更是否已複寫至複本。
識別要用於測試的資料表,例如 Customers 資料表,然後在每部伺服器上執行下列命令,確認所包含的項目數目在主要和複本伺服器上是相同的:
select count(*) from customers;
記下項目計數以供稍後比較。
若要測試複寫,請嘗試在主要伺服器上的客戶資料表中新增一些資料,然後確認新資料已複寫。 在此情況下,您會將兩個數據列新增至主伺服器上的資料表,然後確認複本伺服器上已復寫。
在主要伺服器上的 Customers 資料表中,執行下列命令來插入資料列:
insert into `customers`(`customerNumber`,`customerName`,`contactLastName`,`contactFirstName`,`phone`,`addressLine1`,`addressLine2`,`city`,`state`,`postalCode`,`country`,`salesRepEmployeeNumber`,`creditLimit`) values (<ID>,'name1','name2','name3 ','11.22.5555','54, Add',NULL,'Add1',NULL,'44000','country',1370,'21000.00');
若要檢查複寫狀態,請呼叫 show slave status \G 以確認複寫如預期般運作。
若要確認計數相同,請在複本伺服器上執行下列命令:
select count(*) from customers;
確定成功完全移轉
若要確保成功完全移轉,請執行下列工作:
- 設定適當的伺服器層級防火牆和虛擬網路規則,以連線到目標伺服器。 您可以從入口網站比較來源和目標的防火牆規則。
- 在目標伺服器中設定適當的登入和資料庫層級權限。 您可以在來源和目標伺服器上執行 SELECT FROM mysql.user; 以進行比較。
- 請確定適用於 MySQL 的 Azure 資料庫單一伺服器的所有連入連線都已停止。
提示
您可以將適用於 MySQL 的 Azure 資料庫單一伺服器設定為唯讀。
- 藉由執行 show slave status \G 並確認 Seconds_Behind_Master 參數的值為 0,來確保複本伺服器已跟上主要伺服器的進度。
- 將用戶端和用戶端應用程式重新導向至適用於 MySQL 的 Azure 資料庫彈性伺服器的目標執行個體。
- 藉由執行 mysql.az_replication_stop 預存程序來執行最終完全移轉,該預存程序會停止從複本伺服器複寫。
- 呼叫 mysql.az_replication_remove_master 以移除資料輸入複寫組態。
此時,您的應用程式會連線到新的適用於 MySQL 的 Azure 資料庫彈性伺服器,且來源中的變更將不再複寫至目標。 使用 Azure 入口網站建立和管理適用於 MySQL 的 Azure 資料庫防火牆規則