如何為適用於 MySQL 的 Azure 資料庫設定複寫中的資料

適用於: 適用於 MySQL 的 Azure 資料庫 - 單一伺服器

重要

適用於 MySQL 的 Azure 資料庫 單一伺服器位於淘汰路徑上。 強烈建議您升級至適用於 MySQL 的 Azure 資料庫彈性伺服器。 如需移轉至適用於 MySQL 的 Azure 資料庫彈性伺服器的詳細資訊,請參閱適用於 MySQL 的 Azure 資料庫單一伺服器會發生什麼事?

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

注意

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

若要在適用於 MySQL 的 Azure 資料庫服務中建立複本,資料輸入複寫會同步處理內部部署來源 MySQL 伺服器、虛擬機器 (VMs) 或雲端資料庫服務中的資料。 資料輸入複寫是建立在以二進位記錄 (binlog) 檔案位置為基礎,或以 GTID 為基礎的 MySQL 原生複寫之上。 若要深入了解 binlog 複寫,請參閱 MySQL binlog 複寫概觀 \(英文\)。

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

建立適用於 MySQL 的 Azure 資料庫單一伺服器執行個體,以作為複本使用

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

    重要

    適用於 MySQL 的 Azure 資料庫伺服器必須在常規用途或記憶體最佳化定價層中建立,因為只有這些層才支援資料輸入複寫。 5.7 和 8.0 版僅支援最多 16 TB (一般用途儲存體 v2) 的伺服器上才支援 GTID。

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

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

  3. 將來源伺服器的 IP 位址新增至複本的防火牆規則。

    使用 Azure 入口網站Azure CLI 更新防火牆規則。

  4. 選用- 如果您想使用從來源伺服器至適用於 MySQL 的 Azure 資料庫複本伺服器的 GTID 型複寫,您必須在適用於 MySQL 的 Azure 資料庫伺服器上啟用下列伺服器參數,如下方入口網站圖片所示:

    Enable GTID on Azure Database for MySQL server

設定來源 MySQL 伺服器

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

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

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

    嘗試從裝載於另一部電腦上的 MySQL 命令列,或從 Azure 入口網站提供的 Azure Cloud Shell 等工具進行連線,以測試來源伺服器的連線能力。

    如果您的組織具有嚴格的安全性原則,而且不允許來源伺服器上的所有 IP 位址啟用從 Azure 到來源伺服器的通訊,您或許可以使用下列命令來判斷 MySQL 伺服器的 IP 位址。

    1. 使用如 MySQL 命令列的工具,登入適用於 MySQL 的 Azure 資料庫伺服器。

    2. 執行以下查詢。

      mysql> SELECT @@global.redirect_server_host;
      

      以下是一些範例輸出:

      +-----------------------------------------------------------+
      | @@global.redirect_server_host                             |
      +-----------------------------------------------------------+
      | e299ae56f000.tr1830.westus1-a.worker.database.windows.net |
       +-----------------------------------------------------------+
      
    3. 退出 MySQL 命令列。

    4. 若要取得 IP 位址,請在 ping 公用程式中執行下列命令:

      ping <output of step 2b>
      

      例如:

      C:\Users\testuser> ping e299ae56f000.tr1830.westus1-a.worker.database.windows.net
      Pinging tr1830.westus1-a.worker.database.windows.net (**11.11.111.111**) 56(84) bytes of data.
      
    5. 設定來源伺服器的防火牆規則,以在連接埠 3306 中包含上一個步驟的輸出 IP 位址。

      注意

      此 IP 位址可能會因為維護/部署作業而變更。 此連線方法僅適用於無法在 3306 連接埠上允許所有 IP 位址的客戶。

  3. 開啟二進位記錄。

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

    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;
    

    選用 - 若您想要使用 GTID 型複寫,您必須檢查來源伺服器上是否已啟用 GTID。 您可以對來源 MySQL 伺服器執行下列命令,以查看 gtid_mode 是否為 ON。

    show variables like 'gtid_mode';
    

    重要

    所有伺服器均將 gtid_mode 設為預設值「OFF」。 無需特別在來源 MySQL 伺服器上啟用 GTID,即可設定資料輸入複寫。 若來源伺服器上已啟用 GTID,您也可以選擇性地使用 GTID 型複寫來設定使用適用於 MySQL 的 Azure 資料庫單一伺服器資料,來設定資料輸入複寫。 不論來源伺服器上的 gitd_mode 設定為何,您都可以使用檔案型複寫來為所有伺服器設定資料輸入複寫。

  5. 建立新的複寫角色並設定權限。

    在使用複寫權限設定的來源伺服器上建立使用者帳戶。 此作業可透過 SQL 命令或 MySQL Workbench 等工具完成。 考慮是打算否使用 SSL 進行複寫,因為此設定必須在建立使用者時指定。 請參閱 MySQL 文件,了解如何在來源伺服器中新增使用者帳戶

    在下列命令中,新建的複寫角色除了從裝載來源伺服器的機器存取來源伺服器,還可從任何機器存取來源伺服器。 在建立使用者命令中指定 "syncuser@'%'",即可執行此作業。 請參閱 MySQL 文件,進一步了解如何指定帳戶名稱

    SQL 命令

    使用 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'@'%';
    

    MySQL Workbench

    若要在 MySQL Workbench 中建立複寫角色,請從 [管理] 面板開啟 [使用者和權限] 面板,然後選取 [新增帳戶]

    Users and Privileges

    在 [登入名稱] 欄位中輸入使用者名稱。

    Sync user

    選取 [管理角色] 面板,然後從 [全域權限] 清單選取 [複寫從屬]。 然後選取 [套用] 以建立複寫角色。

    Replication Slave

  6. 將來源伺服器設為唯讀模式。

    開始傾印資料庫之前,伺服器必須處於唯讀模式。 處於唯讀模式時,來源伺服器無法處理任何寫入交易。 必要時可評估對業務的影響,並為巔峰和離峰時間排程唯讀時段。

    FLUSH TABLES WITH READ LOCK;
    SET GLOBAL read_only = ON;
    
  7. 取得二進位記錄檔的檔案名稱和位移。

    執行 show master status 命令,以判斷目前二進位記錄檔的檔案名稱和位移。

     show master status;
    

    結果應該會類似如下。 請務必記下二進位檔案名稱,以便於在後續步驟中使用。

    Master Status Results

傾印並還原來源伺服器

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

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

  2. 選用 - 如果您想要使用 gtid 型複寫,您必須識別在主要伺服器上,最後一筆交易所執行的 GTID。 您可以使用下列命令來記下在主伺服器上最後一筆交易所執行的 GTID。

    show global variables like 'gtid_executed';
    
  3. 將來源伺服器設為讀取/寫入模式。

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

    SET GLOBAL read_only = OFF;
    UNLOCK TABLES;
    
  4. 將傾印檔案還原至新的伺服器。

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

  5. 選用- 記下適用於 MySQL 的 Azure 資料庫上還原伺服器的 GTID,以確保它與主要伺服器相同。 您可以使用下列命令來記下適用於 MySQL 的 Azure 資料庫複本伺服器上已清除之 GTID 值的 GTID。 其 gtid_purged 的值,應該與步驟 2 中所述主要伺服器上的 gtid_executed 相同,GTID 型複寫才能運作。

    show global variables like 'gtid_purged';
    
  1. 設定來源伺服器。

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

    若要連結兩個伺服器並啟動複寫,請在適用於 MySQL 的 Azure 資料庫服務中登入目標複本伺服器,然後將外部執行個體設為來源伺服器。 在適用於 MySQL 的 Azure 資料庫伺服器上使用 mysql.az_replication_change_master 預存程序,即可執行此作業。

    CALL mysql.az_replication_change_master('<master_host>', '<master_user>', '<master_password>', <master_port>, '<master_log_file>', <master_log_pos>, '<master_ssl_ca>');
    

    選用 - 如果您想要使用 gtid 型複寫,您必須使用下列命令連結兩部伺服器

    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 服務」設定為「開啟」,讓來源伺服器與複本伺服器能彼此通訊。 於連線安全性選項可以變更此項設定。 如需詳細資訊,請參閱使用入口網站管理防火牆規則

    範例

    使用 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);
    

    不使用 SSL 的複寫

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

    CALL mysql.az_replication_change_master('master.companya.com', 'syncuser', 'P@ssword!', 3306, 'mysql-bin.000002', 120, '');
    
  2. 設定篩選。

    若想要略過從主要伺服器複寫部分資料表,請更新 replicate_wild_ignore_table 複本伺服器上的伺服器參數。 您可以使用逗號分隔清單來提供多個資料表模式。

    請檢閱 MySQL 文件 \(英文\),以深入了解此參數。

    若要更新參數,您可以使用 Azure 入口網站Azure CLI

  3. 開始複寫。

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

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

    在複本伺服器上呼叫 show slave status 命令,以檢視複寫狀態。

    show slave status;
    

    Slave_IO_RunningSlave_SQL_Running 的狀態為「是」,且 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;

選用 - 如果您想要使用 gtid 型複寫,請使用下列預存程式略過交易

call mysql. az_replication_skip_gtid_transaction(‘<transaction_gtid>’)

此程序可以略過指定 GTID 的交易。 若 GTID 格式不正確,或已經執行 GTID 交易,則此程序將無法執行。 交易的 GTID 可以透過剖析二進位記錄以檢查交易事件來判斷。 MySQL 提供公用程式 mysqlbinlog 來剖析二進位記錄,並以文字格式顯示內容,其可用來識別交易的 GTID。

重要

此程序只能用來略過一筆交易,而且無法用來略過已設定的 gtid 或設定 gtid_purged。

若要在目前的複寫位置之後略過下一筆交易,請使用下列命令來識別下一筆交易的 GTID,如下所示。

SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos][LIMIT [offset,] row_count]

Show binary log results

下一步