使用資料輸入複寫將適用於 MySQL 的 Amazon RDS 移轉至適用於 MySQL 的 Azure 資料庫
注意
本文包含「從屬」一詞的參考,Microsoft 已不再使用該字詞。 從軟體中移除該字詞時,我們也會將其從本文中移除。
您可以使用 MySQL 傾印和還原、MySQL Workbench 匯出和匯入等方法,或 Azure 資料移轉服務 將 MySQL 資料庫移轉至 適用於 MySQL 的 Azure 資料庫 彈性伺服器。 藉由搭配資料輸入複寫使用 mysqldump 或 mydumper 和 myloader 等開放原始碼工具的組合,您可以透過最短停機來移轉工作負載。
資料輸入複寫是一種技術,可根據二進位記錄檔位置方法,將資料變更從來源伺服器複寫到目的地伺服器。 在此情節中,做為來源 (資料庫變更的來源) 的 MySQL 執行個體,會將更新和變更以「事件」的形式寫入到二進位記錄。 二進位記錄中的資訊會根據所記錄的資料庫變更,以不同的記錄格式儲存。 複本會設定為從來源讀取二進位記錄,並在複本的本地資料庫上執行二進位記錄中的事件。
設定將數據復寫到 適用於 MySQL 的 Azure 資料庫 - 彈性伺服器,將數據從來源 MySQL 伺服器同步處理至目標 MySQL 伺服器。 您可以選擇性地將應用程式從主要 (或來源資料庫) 完全移轉至複本 (或目標資料庫)。
在本教學課程中,您將瞭解如何在執行適用於 MySQL 的 Amazon Relational Database Service (RDS) 的來源伺服器與執行 適用於 MySQL 的 Azure 資料庫 彈性伺服器的目標伺服器之間設定數據輸入複寫。
效能考量
開始本教學課程之前,請考慮您將用來執行作業之用戶端電腦位置和容量的效能影響。
用戶端位置
從與資料庫伺服器位於相同位置啟動的用戶端電腦執行傾印或還原作業:
- 針對 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例,用戶端電腦應該位於與目標資料庫伺服器相同的虛擬網路和可用性區域中。
- 針對來源 Amazon RDS 資料庫執行個體,用戶端執行個體應該存在於與來源資料庫伺服器相同的 Amazon 虛擬私人雲端和可用性區域中。 在上述案例中,您可以使用 FTP 或 SFTP 之類的檔案傳輸通訊協定,在用戶端機器之間移動傾印檔案,或將其上傳至 Azure Blob 儲存體。 若要減少移轉總時間,請先壓縮檔案再傳輸。
用戶端容量
無論用戶端電腦位於何處,都需要足夠的計算、I/O 和網路容量來執行要求的作業。 一般建議為:
- 如果傾印或還原牽涉到資料的即時處理,例如壓縮或解壓縮,請選擇每個傾印或還原執行緒至少有一個 CPU 核心的執行個體類別。
- 請確定用戶端執行個體有足夠的網路頻寬可用。 使用支援加速網路功能的執行個體類型。 如需詳細資訊,請參閱 Azure 虛擬機器網路指南中的「加速網路」一節。
- 請確定用戶端電腦的儲存層提供預期的讀取/寫入容量。 建議您搭配進階 SSD 儲存體使用 Azure 虛擬機器。
必要條件
若要完成本教學課程,您需要:
在用戶端電腦上安裝 mysqlclient 以建立傾印,並在目標 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例上執行還原作業。
針對較大的資料庫,請安裝 mydumper 和 myloader,以平行傾印和還原資料庫。
注意
Mydumper 只能在 Linux 發行版本上執行。 如需詳細資訊,請參閱如何安裝 mydumper。
建立執行 5.7 或 8.0 版之彈性伺服器的 適用於 MySQL 的 Azure 資料庫 實例。
重要
如果您的目標是適用於 MySQL 的 Azure 資料庫彈性伺服器,且具有區域備援高可用性 (HA),請注意,此設定不支援資料輸入複寫。 因應措施是,在伺服器建立期間設定區域備援 HA:
- 建立已啟用區域備援 HA 的伺服器。
- 停用 HA。
- 請遵循文章來設定資料輸入複寫。
- 完全移轉後移除資料輸入複寫設定。
- 啟用 HA。
請確定已如下所述,正確設定數個參數和功能:
- 基於相容性考慮,請在相同的 MySQL 版本上擁有來源和目標資料庫伺服器。
- 在每個資料表中都有主索引鍵。 資料表上缺少主索引鍵可能會讓複寫程序變慢。
- 請確定來源和目標資料庫的字元集是相同的。
- 將
wait_timeout
參數設定為合理的時間。 時間取決於您要匯入或移轉的資料或工作負載數量。 - 確認您的所有資料表都使用 InnoDB。 適用於 MySQL 的 Azure 資料庫 彈性伺服器僅支援 InnoDB 儲存引擎。
- 對於具有許多次要索引的資料表或大型資料表,還原期間效能額外負荷的影響很明顯。 修改傾印檔案,讓
CREATE TABLE
陳述式不包含次要索引鍵定義。 匯入資料之後,請重新建立次要索引,以避免在還原程序期間的效能損失。
最後,準備進行資料輸入複寫:
- 確認目標 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例可以透過埠 3306 連線到來源 Amazon RDS for MySQL 伺服器。
- 請確定適用於 MySQL 的 Amazon RDS 來源伺服器允許連接埠 3306 上的輸入和輸出流量。
- 請務必使用 Azure ExpressRoute 或 Azure VPN 閘道,為來源伺服器提供站對站連線能力。 如需建立虛擬網路的詳細資訊,請參閱 Azure 虛擬網路文件。 另請參閱快速入門文章,其中包含逐步詳細資料。
- 設定源資料庫伺服器的網路安全組,以允許目標 適用於 MySQL 的 Azure 資料庫 彈性伺服器IP位址。
重要
如果適用於 MySQL 的 Amazon RDS 來源執行個體的 GTID_mode 設為 [開啟],適用於 MySQL 的 Azure 資料庫彈性伺服器的目標執行個體也必須將 GTID_mode 設定為 [開啟]。
設定適用於 MySQL 的 Azure 資料庫的目標執行個體
若要設定 適用於 MySQL 的 Azure 資料庫 彈性伺服器的目標實例,這是數據輸入複寫的目標:
將
max_allowed_packet
參數值設定為上限 1073741824,也就是 1 GB。 這個值可防止與長資料列相關的任何溢位問題。在移轉期間,將
slow_query_log
、general_log
、audit_log_enabled
和query_store_capture_mode
參數設定為 [關閉],以協助消除與查詢記錄相關的任何額外負荷。將目標 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例的計算大小相應增加為最多 64 個虛擬核心。 還原來源伺服器的資料庫傾印時,此大小會提供更多計算資源。
在移轉完成後,您一律可以相應減少計算,以符合應用程式需求。
相應增加儲存體大小,以在移轉期間取得更多 IOPS,或提高移轉的 IOPS 上限。
注意
可用的 IOPS 上限取決於計算大小。 如需詳細資訊,請參閱 適用於 MySQL 的 Azure 資料庫 彈性伺服器的計算和記憶體選項中的 IOPS 一節。
設定適用於 MySQL 的 Amazon RDS 來源伺服器
若要準備及設定在 Amazon RDS 裝載中的 MySQL 伺服器 (這是資料輸入複寫的來源):
確認適用於 MySQL 的 Amazon RDS 來源伺服器上已啟用二進位記錄。 檢查是否已啟用自動備份,或確定適用於 MySQL 的 Amazon RDS 來源伺服器存在讀取複本。
確定來源伺服器上的二進位記錄檔會保留,直到在 適用於 MySQL 的 Azure 資料庫 彈性伺服器的目標實例上套用變更之後。
使用數據輸入複寫時,適用於 MySQL 的 Azure 資料庫 彈性伺服器不會管理複寫程式。
若要檢查來源 Amazon RDS 伺服器上的二進位記錄保留期,以判斷保留的二進位記錄時數,請呼叫
mysql.rds_show_configuration
預存程序:call mysql.rds_show_configuration; +------------------------+-------+-----------------------------------------------------------------------------------------------------------+ | name | value | description | | +------------------------+-------+-----------------------------------------------------------------------------------------------------------+ | | binlog retention hours | 24 | binlog retention hours specifies the duration in hours before binary logs are automatically deleted. | | source delay | 0 | source delay specifies replication delay in seconds between current instance and its master. | | target delay | 0 | target delay specifies replication delay in seconds between current instance and its future read-replica. | | +------------------------+------- +-----------------------------------------------------------------------------------------------------------+ | | 3 rows in set (0.00 sec) |
若要設定二進位記錄保留期間,請執行
rds_set_configuration
預存程序,以確保二進位記錄會在來源伺服器上保留所需的時間。 例如:Call mysql.rds_set_configuration('binlog retention hours', 96);
如果您要建立傾印並還原,上述命令可協助您快速趕上差異變更。
注意
請確定有足夠的磁碟空間,可根據定義的保留期間,將二進位記錄儲存在來源伺服器上。
有兩種方式可從適用於 MySQL 的 Amazon RDS 來源伺服器擷取資料傾印。 其中一種方法牽涉到直接從來源伺服器擷取資料的傾印。 另一種方法涉及從適用於 MySQL 的 Amazon RDS 讀取複本擷取傾印。
若要直接從來源伺服器擷取資料的傾印:
請確定您停止來自應用程式的寫入數分鐘,以取得交易一致的資料傾印。
您也可以暫時將
read_only
參數設定為 1 的值,以便在擷取資料傾印時不會處理寫入。在您停止來源伺服器上的寫入之後,請執行命令
Mysql> Show master status;
來收集二進位記錄檔名稱和位移。儲存這些值,以從您的 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例開始復寫。
若要建立資料的傾印,請執行下列命令來執行
mysqldump
:$ mysqldump -h hostname -u username -p –single-transaction –databases dbnames –order-by-primary> dumpname.sql
如果停止來源伺服器上的寫入不是選項,或來源伺服器上無法接受傾印資料的效能,請在複本伺服器上擷取傾印:
使用與來源伺服器相同的設定建立 Amazon MySQL 讀取複本。 然後在該處建立傾印。
讓適用於 MySQL 的 Amazon RDS 讀取複本趕上適用於 MySQL 的 Amazon RDS 來源伺服器。
當複本延遲在讀取複本上達到 0 時,請呼叫預存程序
mysql.rds_stop_replication
來停止複寫。call mysql.rds_stop_replication;
當複寫停止時,連接到複本。 然後執行
SHOW SLAVE STATUS
命令,從 [Relay_Master_Log_File] 欄位擷取目前的二進位記錄檔檔案名稱,並從 [Exec_Master_Log_Pos] 欄位擷取記錄檔位置。儲存這些值,以從您的 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例開始復寫。
若要從適用於 MySQL 的 Amazon RDS 讀取複本建立資料的傾印,請執行下列命令來執行
mysqldump
:$ mysqldump -h hostname -u username -p –single-transaction –databases dbnames –order-by-primary> dumpname.sql
注意
您也可以使用 mydumper,從適用於 MySQL 的 Amazon RDS 來源資料庫擷取資料的平行傾印。 如需詳細資訊,請參閱使用 mydumper/myloader 將大型資料庫移轉至 適用於 MySQL 的 Azure 資料庫 彈性伺服器。
連結來源和複本伺服器以啟動資料輸入複寫
若要使用 mysql 原生還原來還原資料庫,請執行下列命令:
$ mysql -h <target_server> -u <targetuser> -p < dumpname.sql
注意
如果您改用 myloader,請參閱使用 mydumper/myloader 將大型資料庫移轉至 適用於 MySQL 的 Azure 資料庫 彈性伺服器。
登入適用於 MySQL 的 Amazon RDS 來源伺服器,並設定複寫使用者。 然後將必要的權限授與此使用者。
如果您使用 SSL,請執行下列命令:
CREATE USER 'syncuser'@'%' IDENTIFIED BY 'userpassword'; GRANT REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'syncuser'@'%' REQUIRE SSL; SHOW GRANTS FOR syncuser@'%';
如果您不是使用 SSL,請執行下列命令:
CREATE USER 'syncuser'@'%' IDENTIFIED BY 'userpassword'; GRANT REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'syncuser'@'%'; SHOW GRANTS FOR syncuser@'%';
預存程序會執行所有資料輸入複寫函式。 如需所有程序的相關資訊,請參閱資料輸入複寫預存程序。 您可以在 MySQL Shell 或 MySQL Workbench 中執行已儲存的程序。
若要連結 Amazon RDS for MySQL 來源伺服器和 適用於 MySQL 的 Azure 資料庫 彈性伺服器目標伺服器,請登入目標 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例。 執行下列命令,將適用於 MySQL 的 Amazon RDS 伺服器設定為來源伺服器:
CALL mysql.az_replication_change_master('source_server','replication_user_name','replication_user_password',3306,'<master_bin_log_file>',master_bin_log_position,'<master_ssl_ca>');
若要啟動來源 Amazon RDS for MySQL 伺服器與目標 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例之間的複寫,請執行下列命令:
CALL mysql.az_replication_start;
若要檢查複寫狀態,請在複本伺服器上執行下列命令:
show slave status\G
如果
Slave_IO_Running
和Slave_SQL_Running
參數的狀態為 [是],則複寫已啟動且處於執行中狀態。檢查
Seconds_Behind_Master
參數的值,以判斷目標伺服器的延遲程度。如果值為 0,則目標已處理來自來源伺服器的所有更新。 如果值是 0以外的值,目標伺服器仍會處理更新。
確定成功完全移轉
確定成功完全移轉:
- 在目標 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例中設定適當的登入和資料庫層級許可權。
- 停止對適用於 MySQL 的 Amazon RDS 來源伺服器的寫入。
- 請確定目標 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例已趕上來源伺服器,且
Seconds_Behind_Master
值來自show slave status
0。 - 呼叫預存程式
mysql.az_replication_stop
來停止復寫,因為所有變更都已復寫到目標 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例。 - 呼叫
mysql.az_replication_remove_master
以移除資料輸入複寫設定。 - 將用戶端和用戶端應用程式重新導向至目標 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例。
移轉目前已完成。 您的應用程式會連線到執行 適用於 MySQL 的 Azure 資料庫 彈性伺服器的伺服器。