Share via


如何設定適用於 MySQL 的 Azure 資料庫 - 彈性伺服器的資料輸入複寫

適用於:適用於 MySQL 的 Azure 資料庫 - 彈性伺服器

本文描述如何透過設定來源和複本伺服器,在適用於 MySQL 的 Azure 資料庫彈性伺服器中設定資料輸入複寫。 本文假設您先前已具備一些使用 MySQL 伺服器和資料庫的經驗。

注意

本文包含「從屬」一詞的參考,Microsoft 已不再使用該字詞。 從軟體中移除該字詞時,我們也會將其從本文中移除。

為了在適用於 MySQL 的 Azure 資料庫彈性伺服器執行個體中建立複本,資料輸入複寫會同步處理內部部署 MySQL 來源伺服器、虛擬機器 (VMs) 或雲端資料庫服務中的資料。 您可以使用二進位記錄 (binlog) 檔案位置型複寫或 GTID 型複寫來設定資料輸入複寫。 若要深入了解 binlog 複寫,請參閱 MySQL 複寫

在執行本文中的步驟之前,請先檢閱資料輸入複寫的限制和需求

建立適用於 MySQL 的 Azure 資料庫彈性伺服器執行個體以作為複本

  1. 建立新的適用於 MySQL 的 Azure 資料庫彈性伺服器執行個體 (例如 replica.mysql.database.azure.com)。 若要了解如何建立伺服器,請參閱使用 Azure 入口網站建立適用於 MySQL 的 Azure 資料庫彈性伺服器執行個體。 此伺服器是資料輸入複寫的「複本」伺服器。

  2. 建立相同的使用者帳戶和對應權限。

    使用者帳戶不會從來源伺服器複寫到複本伺服器。 若預計將提供複本伺服器存取權給使用者,則必須在此新建的適用於 MySQL 的 Azure 資料庫彈性伺服器執行個體中,手動建立所有帳戶及對應權限。

設定來源 MySQL 伺服器

下列步驟會針對裝載在內部部署的 MySQL 伺服器、虛擬機器中的 MySQL 伺服器或由其他雲端提供者所代管的資料庫服務,準備及設定資料帶入複寫。 此伺服器是資料輸入複寫的「來源」。

  1. 請先檢閱來源伺服器需求再繼續。

  2. 網路需求

    • 請確定來源伺服器允許連接埠 3306 上的輸入和輸出流量,且其具有公用 IP 位址、DNS 可公開存取,或具有完整網域名稱 (FQDN)。

    • 如果正在使用私人存取,請確定您在來源伺服器與裝載複本伺服器的 Vnet 之間具有連線能力。

    • 請務必使用 ExpressRouteVPN,為您的內部部署來源伺服器提供站對站連線能力。 如需建立虛擬網路的詳細資訊,請參閱虛擬網路文件,特別是快速入門文章,裡面會提供逐步操作詳細資料。

    • 如果在複本伺服器中使用私人存取,且您的來源是 Azure VM,請確定已建立 VNet 對 VNet 連線能力。 支援 VNet-Vnet 對等互連。 您也可以使用其他連線方法,跨不同區域在 VNet 與 VNet 連線等 VNet 之間進行通訊。 如需詳細資訊,請參閱 VNet 對 VNet VPN 閘道

    • 請確定您的虛擬網路網路安全性群組規則不會封鎖輸出埠 3306 (如果 MySQL 是在 Azure VM 上執行,則包含輸入)。 如需虛擬網路 NSG 流量篩選的詳細資訊,請參閱<使用網路安全性群組來篩選網路流量>(機器翻譯) 一文。

    • 設定來源伺服器的防火牆規則,允許複本伺服器 IP 位址。

  3. 根據您要使用 bin-log 位置型資料輸入複寫還是 GTID 型資料輸入複寫,來遵循適當的步驟。

    執行下列命令,以檢查來源伺服器是否已啟用二進位記錄:

    SHOW VARIABLES LIKE 'log_bin';
    

    如果變數 log_bin 傳回的值是「ON」,表示伺服器上的二進位記錄已啟用。

    log_bin 傳回值為「OFF」,且來源伺服器在內部部署或虛擬機器上執行,您可以在其中存取組態檔 (my.cnf),請遵循下列步驟:

    1. 在來源伺服器中找到 MySQL 組態檔 (my.cnf)。 例如:/etc/my.cnf

    2. 開啟組態檔進行編輯,並在檔案中尋找 mysqld 區段。

    3. 在 mysqld 區段中,新增下列這一行:

      log-bin=mysql-bin.log
      
    4. 在來源伺服器上重新啟動 MySQL 服務 (或重新開機),變更才會生效。

    5. 重新開機伺服器之後,請執行與先前相同的查詢,確認已啟用二進位記錄:

    SHOW VARIABLES LIKE 'log_bin';
    
  4. 設定來源伺服器設定。

    資料輸入複寫要求主要伺服器和複本伺服器之間的參數 lower_case_table_names 需一致。 此參數在適用於 MySQL 的 Azure 資料庫彈性伺服器中預設為 1。

    SET GLOBAL lower_case_table_names = 1;
    
  5. 建立新的複寫角色並設定權限。

    在使用複寫權限設定的來源伺服器上建立使用者帳戶。 此作業可透過 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'@'%';

傾印並還原來源伺服器

  1. 判斷您要複寫到適用於 MySQL 的 Azure 資料庫彈性伺服器中的資料庫和資料表,並從來源伺服器執行傾印。

    您可使用 mysqldump 從主要伺服器傾印資料庫。 如需詳細資料,請參閱傾印和還原。 您不需要傾印 MySQL 程式庫和測試程式庫。

  2. 將來源伺服器設為讀取/寫入模式。

    傾印資料庫後,請將來源的 MySQL 伺服器重新變更為讀取/寫入模式。

    SET GLOBAL read_only = OFF;
    UNLOCK TABLES;
    

[!注意]

將伺服器設定回讀取/寫入模式之前,您可以使用全域變數 GTID_EXECUTED 擷取 GTID 資訊。 稍後的階段會使相同資訊在復本伺服器上設定 GTID

  1. 將傾印檔案還原至新的伺服器。

    將傾印檔案還原至適用於 MySQL 的 Azure 資料庫彈性伺服器中所建立的伺服器。 請參閱傾印和還原,了解如何將傾印檔案還原至 MySQL 伺服器。 如果傾印檔案太大,請先在與複本伺服器所在區域相同的區域中,將檔案上傳至 Azure 內的虛擬機器。 將其從虛擬機器還原至適用於 MySQL 的 Azure 資料庫彈性伺服器執行個體。

注意

如果您希望避免在傾印和還原時將資料庫設定為唯讀,您可以使用 mydumper/myloader

在複本伺服器中設定 GTID

  1. 如果使用 bin-log 位置型複寫,請略過此步驟

  2. 必須有從來源擷取的傾印檔案中的 GTID 資訊,才能重設目標 (複本) 伺服器的 GTID 歷程記錄。

  3. 使用來源中的這個 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 重設動作會使所有可用的備份失效,因此,在重新啟用異地備援後,可能需要等一天才能在伺服器上執行異地還原

  1. 設定來源伺服器。

    所有「複寫中的資料」功能都可由已儲存的程序執行完成。 您可在複寫中的資料已儲存的程序中找到所有程序。 已儲存的程序可在 MySQL Shell 或 MySQL Workbench 中執行。

若要連結兩個伺服器並啟動複寫,請在適用於 MySQL 的 Azure 資料庫服務中登入目標複本伺服器,然後將外部執行個體設為來源伺服器。 在適用於 MySQL 的 Azure 資料庫伺服器上使用 mysql.az_replication_change_mastermysql.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 服務」設定為「開啟」,讓來源伺服器與複本伺服器能彼此通訊。 於連線安全性選項可以變更此項設定。 如需詳細資訊,請參閱使用入口網站管理防火牆規則
  • 如果您使用 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-----'

來源伺服器 (裝載於「companya.com」網域) 和複本伺服器 (裝載於適用於 MySQL 的 Azure 資料庫彈性伺服器) 之間會設定「使用 SSL 的複寫」。 此已儲存的程序可在複本伺服器上執行。

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, '');
  1. 開始複寫。

    呼叫 mysql.az_replication_start 預存程序以開始複寫。

    CALL mysql.az_replication_start;
    
  2. 檢查複寫狀態。

    在複本伺服器上呼叫 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]

Show binary log results

下一步