如何設定適用於 MySQL 的 Azure 資料庫 - 彈性伺服器的資料輸入複寫
本文說明如何藉由設定來源和複本伺服器,在 適用於 MySQL 的 Azure 資料庫 彈性伺服器中設定複寫數據至 適用於 MySQL 的 Azure 資料庫 - 彈性伺服器。 本文假設您先前已具備一些使用 MySQL 伺服器和資料庫的經驗。
注意
本文包含「從屬」一詞的參考,Microsoft 已不再使用該字詞。 從軟體中移除該字詞時,我們也會將其從本文中移除。
若要在 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例中建立複本,請將數據復寫到 適用於 MySQL 的 Azure 資料庫 - 彈性伺服器會同步處理內部部署來源 MySQL 伺服器、虛擬機(VM)或雲端資料庫服務中的數據。 您可以使用二進位記錄 (binlog) 檔案位置型複寫或 GTID 型複寫來設定資料輸入複寫。 若要深入了解 binlog 複寫,請參閱 MySQL 複寫。
在執行本文中的步驟之前,請先檢閱資料輸入複寫的限制和需求。
建立 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例以作為複本使用
建立 適用於 MySQL 的 Azure 資料庫 彈性伺服器的新實例(例如
replica.mysql.database.azure.com
)。 請參閱快速入門:使用伺服器建立 Azure 入口網站 建立 適用於 MySQL 的 Azure 資料庫 實例。 此伺服器是資料輸入複寫的「複本」伺服器。建立相同的使用者帳戶和對應權限。
使用者帳戶不會從來源伺服器複寫到複本伺服器。 如果您打算為使用者提供複本伺服器的存取權,您必須在此新建立的 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例上手動建立所有帳戶和對應的許可權。
設定來源 MySQL 伺服器
下列步驟會針對裝載在內部部署的 MySQL 伺服器、虛擬機器中的 MySQL 伺服器或由其他雲端提供者所代管的資料庫服務,準備及設定資料帶入複寫。 此伺服器是資料輸入複寫的「來源」。
請先檢閱來源伺服器需求再繼續。
網路需求
請確定來源伺服器允許連接埠 3306 上的輸入和輸出流量,且其具有公用 IP 位址、DNS 可公開存取,或具有完整網域名稱 (FQDN)。
如果私人存取 (VNet 整合) 正在使用中,請確定您在來源伺服器與裝載復本伺服器的 Vnet 之間具有連線能力。
請務必使用 ExpressRoute 或 VPN,為您的內部部署來源伺服器提供站對站連線能力。 如需建立虛擬網路的詳細資訊,請參閱虛擬網路文件,特別是快速入門文章,裡面會提供逐步操作詳細資料。
如果在複本伺服器中使用私人存取 (VNet 整合),而且您的來源是 Azure VM,請確定已建立 VNet 對 VNet 連線能力。 支援 VNet-Vnet 對等互連。 您也可以使用其他連線方法,跨不同區域在 VNet 與 VNet 連線等 VNet 之間進行通訊。 如需詳細資訊,請參閱 VNet 對 VNet VPN 閘道
請確定您的虛擬網路網路安全性群組規則不會封鎖輸出埠 3306 (如果 MySQL 是在 Azure VM 上執行,則包含輸入)。 如需虛擬網路 NSG 流量篩選的詳細資訊,請參閱<使用網路安全性群組來篩選網路流量>(機器翻譯) 一文。
設定來源伺服器的防火牆規則,允許複本伺服器 IP 位址。
根據您要使用 bin-log 位置型資料輸入複寫還是 GTID 型資料輸入複寫,來遵循適當的步驟。
執行下列命令,以檢查來源伺服器是否已啟用二進位記錄:
SHOW VARIABLES LIKE 'log_bin';
如果變數
log_bin
傳回的值是「ON」,表示伺服器上的二進位記錄已啟用。若
log_bin
傳回值為「OFF」,且來源伺服器在內部部署或虛擬機器上執行,您可以在其中存取組態檔 (my.cnf),請遵循下列步驟:在來源伺服器中找到 MySQL 組態檔 (my.cnf)。 例如:/etc/my.cnf
開啟組態檔進行編輯,並在檔案中尋找 mysqld 區段。
在 mysqld 區段中,新增下列這一行:
log-bin=mysql-bin.log
在來源伺服器上重新啟動 MySQL 服務 (或重新開機),變更才會生效。
重新開機伺服器之後,請執行與先前相同的查詢,確認已啟用二進位記錄:
SHOW VARIABLES LIKE 'log_bin';
設定來源伺服器設定。
資料輸入複寫要求主要伺服器和複本伺服器之間的參數
lower_case_table_names
需一致。 此參數預設為 1,適用於 MySQL 的 Azure 資料庫 彈性伺服器。SET GLOBAL lower_case_table_names = 1;
建立新的複寫角色並設定權限。
在使用複寫權限設定的來源伺服器上建立使用者帳戶。 此作業可透過 SQL 命令或 MySQL Workbench 等工具完成。 考慮是打算否使用 SSL 進行複寫,因為此設定必須在建立使用者時指定。 請參閱 MySQL 文件,了解如何在來源伺服器中新增使用者帳戶。
在下列命令中,新建的複寫角色除了從裝載來源伺服器的機器存取來源伺服器,還可從任何機器存取來源伺服器。 在建立使用者命令中指定 "syncuser@'%'",即可執行此作業。 請參閱 MySQL 文件,進一步了解如何指定帳戶名稱。
使用 SSL 的複寫
若要讓所有使用者連線都使用 SSL,請使用以下命令建立使用者:
CREATE USER 'syncuser'@'%' IDENTIFIED BY 'yourpassword'; GRANT REPLICATION SLAVE ON *.* TO ' syncuser'@'%' REQUIRE SSL;
不使用 SSL 的複寫
若所有連線皆不需要使用 SSL,請使用以下命令建立使用者:
CREATE USER 'syncuser'@'%' IDENTIFIED BY 'yourpassword'; GRANT REPLICATION SLAVE ON *.* TO ' syncuser'@'%';
將來源伺服器設為唯讀模式。
開始傾印資料庫之前,伺服器必須處於唯讀模式。 處於唯讀模式時,來源伺服器無法處理任何寫入交易。 必要時可評估對業務的影響,並為巔峰和離峰時間排程唯讀時段。
FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON;
取得二進位記錄檔的檔案名稱和位移。
執行
show master status
命令,以判斷目前二進位記錄檔的檔案名稱和位移。show master status;
結果應該會類似如下。 請務必記下二進位檔案名稱,以便於在後續步驟中使用。
傾印並還原來源伺服器
判斷您要復寫到 適用於 MySQL 的 Azure 資料庫 彈性伺服器中的資料庫和數據表,然後從來源伺服器執行傾印。
您可使用 mysqldump 從主要伺服器傾印資料庫。 如需詳細資料,請參閱傾印和還原。 您不需要傾印 MySQL 程式庫和測試程式庫。
將來源伺服器設為讀取/寫入模式。
傾印資料庫後,請將來源的 MySQL 伺服器重新變更為讀取/寫入模式。
SET GLOBAL read_only = OFF; UNLOCK TABLES;
注意
將伺服器設定回讀取/寫入模式之前,您可以使用全域變數 GTID_EXECUTED 擷取 GTID 資訊。 這會在稍後階段用於在複本伺服器上設定 GTID。
將傾印檔案還原至新的伺服器。
將傾印檔案還原至 適用於 MySQL 的 Azure 資料庫 彈性伺服器中建立的伺服器。 請參閱傾印和還原,了解如何將傾印檔案還原至 MySQL 伺服器。 如果傾印檔案太大,請先在與複本伺服器所在區域相同的區域中,將檔案上傳至 Azure 內的虛擬機器。 從虛擬機將它還原至 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例。
注意
如果您希望避免在傾印和還原時將資料庫設定為唯讀,您可以使用 mydumper/myloader。
在複本伺服器中設定 GTID
如果使用 bin-log 位置型複寫,請略過此步驟
必須有從來源擷取的傾印檔案中的 GTID 資訊,才能重設目標 (複本) 伺服器的 GTID 歷程記錄。
使用來源中的這個 GTID 資訊,透過下列 CLI 命令在復本伺服器上執行 GTID 重設:
az mysql flexible-server gtid reset --resource-group <resource group> --server-name <replica server name> --gtid-set <gtid set from the source server> --subscription <subscription id>
如需詳細資訊,請參閱 GTID 重設。
注意
無法在已啟用異地備援備份的伺服器上執行 GTID 重設。 請停用異地備援,以在伺服器上執行 GTID 重設。 您可以在重設 GTID 之後重新啟用異地備援選項。 GTID 重設動作會使所有可用的備份失效,因此,一旦再次啟用異地備援,可能需要一天的時間,才能在伺服器上執行異地還原
連結來源和複本伺服器以啟動資料輸入複寫
設定來源伺服器。
所有「複寫中的資料」功能都可由已儲存的程序執行完成。 您可在複寫中的資料已儲存的程序中找到所有程序。 已儲存的程序可在 MySQL Shell 或 MySQL Workbench 中執行。
若要連結兩個伺服器並啟動複寫,請在適用於 MySQL 的 Azure 資料庫服務中登入目標複本伺服器,然後將外部執行個體設為來源伺服器。 在適用於 MySQL 的 Azure 資料庫伺服器上使用
mysql.az_replication_change_master
或mysql.az_replication_change_master_with_gtid
預存程序,即可執行此作業。CALL mysql.az_replication_change_master('<master_host>', '<master_user>', '<master_password>', <master_port>, '<master_log_file>', <master_log_pos>, '<master_ssl_ca>');
CALL mysql.az_replication_change_master_with_gtid('<master_host>', '<master_user>', '<master_password>', <master_port>,'<master_ssl_ca>');
- master_host:來源伺服器的主機名稱
- master_user:來源伺服器的使用者名稱
- master_password:來源伺服器的密碼
- master_port:來源伺服器正在接聽連線的連接埠號碼。 (3306 是 MySQL 正在接聽的預設連接埠)
- master_log_file:執行
show master status
產生的二進位記錄檔的名稱 - master_log_pos:執行
show master status
產生的二進位記錄檔的位置 - master_ssl_ca:CA 憑證的內容。 如果不使用 SSL,請傳入空字串。
建議將此參數以變數形式傳遞。 如需詳細資訊,請瀏覽下列範例。
注意
- 若來源伺服器裝載於 Azure 虛擬機器,將「允許存取 Azure 服務」設定為「開啟」,讓來源伺服器與複本伺服器能彼此通訊。 於連線安全性選項可以變更此項設定。 如需詳細資訊,請參閱使用 Azure 入口網站 管理 適用於 MySQL 的 Azure 資料庫 - 彈性伺服器的防火牆規則。
- 如果您使用 mydumper/myloader 傾印資料庫,您可以從 /backup/metadata 檔案取得 master_log_file 和 master_log_pos。
範例
使用 SSL 的複寫
執行下列 MySQL 命令可建立變數
@cert
:SET @cert = '-----BEGIN CERTIFICATE----- PLACE YOUR PUBLIC KEY CERTIFICATE'`S CONTEXT HERE -----END CERTIFICATE-----'
使用 SSL 的復寫是在裝載於網域 「companya.com」的來源伺服器與裝載於 適用於 MySQL 的 Azure 資料庫 彈性伺服器中的複本伺服器之間設定。 此已儲存的程序可在複本伺服器上執行。
CALL mysql.az_replication_change_master('master.companya.com', 'syncuser', 'P@ssword!', 3306, 'mysql-bin.000002', 120, @cert);
CALL mysql.az_replication_change_master_with_gtid('master.companya.com', 'syncuser', 'P@ssword!', 3306, @cert);
不使用 SSL 的複寫
在裝載於網域 「companya.com」的來源伺服器與裝載於 適用於 MySQL 的 Azure 資料庫 彈性伺服器中的復本伺服器之間,會設定不含 SSL 的復寫。 此已儲存的程序可在複本伺服器上執行。
CALL mysql.az_replication_change_master('master.companya.com', 'syncuser', 'P@ssword!', 3306, 'mysql-bin.000002', 120, '');
CALL mysql.az_replication_change_master_with_gtid('master.companya.com', 'syncuser', 'P@ssword!', 3306, '');
開始複寫。
呼叫
mysql.az_replication_start
預存程序以開始複寫。CALL mysql.az_replication_start;
檢查複寫狀態。
在複本伺服器上呼叫
show slave status
命令,以檢視複寫狀態。show slave status;
若要知道複寫的正確狀態,請參閱 [監視] 頁面下的複寫計量 - 複本 IO 狀態和複本 SQL 狀態。
如果
Seconds_Behind_Master
為「0」,則表示複寫正常運作。Seconds_Behind_Master
可指定複本的延遲時間。 若值不是「0」,代表複本正在處理更新。
資料輸入複寫作業的其他實用預存程序
停止複寫
若要停止來源和複本伺服器之間的複寫,請使用下列預存程序:
CALL mysql.az_replication_stop;
移除複寫關聯
若要移除來源和複本伺服器之間的關聯,請使用下列預存程序:
CALL mysql.az_replication_remove_master;
略過複寫錯誤
若要略過複寫錯誤並允許複寫繼續,請使用下列預存程序:
CALL mysql.az_replication_skip_counter;
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos][LIMIT [offset,] row_count]