文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


7.6.7.3 複製遠端資料

複製外掛程式支援以下語法來複製遠端資料;也就是說,從遠端 MySQL 伺服器執行個體(捐贈者)複製資料,並將其傳輸到啟動複製作業的 MySQL 執行個體(接收者)。

CLONE INSTANCE FROM 'user'@'host':port
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];

其中

  • user 是捐贈者 MySQL 伺服器執行個體上的複製使用者。

  • passworduser 密碼。

  • host 是捐贈者 MySQL 伺服器執行個體的 hostname 位址。不支援網際網路通訊協定第 6 版 (IPv6) 位址格式。可以使用 IPv6 位址的別名來代替。可以直接使用 IPv4 位址。

  • port 是捐贈者 MySQL 伺服器執行個體的 port 號碼。(不支援 mysqlx_port 所指定的 X 通訊協定連接埠。也不支援透過 MySQL Router 連接到捐贈者 MySQL 伺服器執行個體。)

  • DATA DIRECTORY [=] 'clone_dir' 是一個選用子句,用於指定接收者上用於複製資料的目錄。如果您不想從接收者資料目錄中移除現有的使用者建立的資料(結構描述、表格、表空間)和二進制日誌,請使用此選項。需要絕對路徑,且目錄不得存在。MySQL 伺服器必須具有建立目錄的必要寫入權限。

    當未使用選用的 DATA DIRECTORY [=] 'clone_dir' 子句時,複製作業會從接收者資料目錄中移除使用者建立的資料(結構描述、表格、表空間)和二進制日誌,將新資料複製到接收者資料目錄,並在之後自動重新啟動伺服器。

  • [REQUIRE [NO] SSL] 明確指定在透過網路傳輸複製資料時是否要使用加密連線。如果無法滿足明確的規範,則會傳回錯誤。如果未指定 SSL 子句,複製操作預設會嘗試建立加密連線,如果安全連線嘗試失敗,則會回退到不安全的連線。無論是否指定此子句,在複製加密資料時都必須使用安全連線。有關更多資訊,請參閱設定用於複製的加密連線

注意

預設情況下,使用者建立的 InnoDB 資料表和表空間(位於捐贈者 MySQL 伺服器實例上的資料目錄中)會複製到接收者 MySQL 伺服器實例上的資料目錄。如果指定了 DATA DIRECTORY [=] 'clone_dir' 子句,則會將它們複製到指定的目錄。

使用者建立的 InnoDB 資料表和表空間(位於捐贈者 MySQL 伺服器實例上的資料目錄之外)會複製到接收者 MySQL 伺服器實例上的相同路徑。如果資料表或表空間已存在,則會報告錯誤。

預設情況下,InnoDB 系統表空間、重做日誌和撤銷表空間會複製到捐贈者上配置的相同位置(由 innodb_data_home_dirinnodb_data_file_pathinnodb_log_group_home_dirinnodb_undo_directory 分別定義)。如果指定了 DATA DIRECTORY [=] 'clone_dir' 子句,這些表空間和日誌會複製到指定的目錄。

遠端複製的先決條件

若要執行複製操作,必須在捐贈者和接收者 MySQL 伺服器實例上都啟用複製外掛程式。有關安裝說明,請參閱第 7.6.7.1 節「安裝複製外掛程式」

捐贈者和接收者上都需要一個 MySQL 使用者才能執行複製操作(即複製使用者)。

  • 在捐贈者上,複製使用者需要 BACKUP_ADMIN 權限,才能從捐贈者存取和傳輸資料,並在複製操作期間阻止並行 DDL。預設情況下,允許在捐贈者上執行並行 DDL。請參閱第 7.6.7.4 節「複製和並行 DDL」

  • 在接收者上,複製使用者需要 CLONE_ADMIN 權限,才能取代接收者資料、在複製操作期間阻止接收者上的 DDL,並自動重新啟動伺服器。CLONE_ADMIN 權限隱含地包含 BACKUP_ADMINSHUTDOWN 權限。

建立複製使用者和授予所需權限的說明包含在以下先決條件資訊之後的遠端複製範例中。

執行 CLONE INSTANCE 陳述式時,會檢查以下先決條件

  • 捐贈者和接收者必須是相同的 MySQL 伺服器系列,例如 8.4.0 和 8.4.11。若要判斷 MySQL 伺服器版本,請執行以下查詢

    mysql> SHOW VARIABLES LIKE 'version';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | version       | 9.0.0 |
    +---------------+-------+
  • 捐贈者和接收者 MySQL 伺服器實例必須在相同的作業系統和平台上執行。例如,如果捐贈者實例在 Linux 64 位元平台上執行,則接收者實例也必須在該平台上執行。請參閱您的作業系統文件,以取得有關如何判斷作業系統平台的資訊。

  • 接收者必須有足夠的磁碟空間來存放複製的資料。預設情況下,使用者建立的資料(結構描述、資料表、表空間)和二進位日誌會在複製捐贈者資料之前從接收者中移除,因此您只需要足夠的空間來存放捐贈者資料。如果您使用 DATA DIRECTORY 子句複製到指定目錄,則您必須有足夠的磁碟空間來存放現有的接收者資料和複製的資料。您可以透過檢查檔案系統上的資料目錄大小以及位於資料目錄之外的任何表空間的大小來估計您的資料大小。在估計捐贈者上的資料大小時,請記住只會複製 InnoDB 資料。如果您將資料儲存在其他儲存引擎中,請相應地調整您的資料大小估計值。

  • InnoDB 允許在資料目錄之外建立某些表空間類型。如果捐贈者 MySQL 伺服器實例有位於資料目錄之外的表空間,則複製操作必須能夠存取這些表空間。您可以查詢 Information Schema FILES 資料表,以識別位於資料目錄之外的表空間。位於資料目錄之外的檔案具有指向資料目錄以外目錄的完整路徑。

    mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES;
  • 捐贈者上啟用的外掛程式(包括任何金鑰環外掛程式)也必須在接收者上啟用。您可以透過執行 SHOW PLUGINS 陳述式或查詢 Information Schema PLUGINS 資料表來識別已啟用的外掛程式。

  • 捐贈者和接收者必須具有相同的 MySQL 伺服器字元集和定序。有關 MySQL 伺服器字元集和定序配置的資訊,請參閱第 12.15 節「字元集配置」

  • 捐贈者和接收者上需要相同的 innodb_page_sizeinnodb_data_file_path 設定。捐贈者和接收者上的 innodb_data_file_path 設定必須指定相同數量的、大小相等的資料檔案。您可以使用 SHOW VARIABLES 語法來檢查變數設定。

    mysql> SHOW VARIABLES LIKE 'innodb_page_size';
    mysql> SHOW VARIABLES LIKE 'innodb_data_file_path';
  • 如果複製加密或頁面壓縮的資料,則捐贈者和接收者必須具有相同的檔案系統區塊大小。對於頁面壓縮的資料,接收者檔案系統必須支援稀疏檔案和空洞穿刺,以便在接收者上發生空洞穿刺。有關這些功能以及如何識別使用這些功能的資料表和表空間的資訊,請參閱第 7.6.7.5 節「複製加密資料」第 7.6.7.6 節「複製壓縮資料」。若要判斷您的檔案系統區塊大小,請參閱您的作業系統文件。

  • 如果您要複製加密資料,則必須使用安全連線。請參閱設定用於複製的加密連線

  • 接收者上的 clone_valid_donor_list 設定必須包含捐贈者 MySQL 伺服器實例的主機位址。您只能從有效捐贈者清單上的主機複製資料。具有 SYSTEM_VARIABLES_ADMIN 權限的 MySQL 使用者才能設定此變數。設定 clone_valid_donor_list 變數的說明會在以下章節的遠端複製範例中提供。您可以使用 SHOW VARIABLES 語法來檢查 clone_valid_donor_list 設定。

    mysql> SHOW VARIABLES LIKE 'clone_valid_donor_list';
  • 不得有其他複製操作正在執行。一次只允許執行單一複製操作。若要判斷是否有複製操作正在執行,請查詢 clone_status 資料表。請參閱使用效能結構描述複製資料表來監控複製操作

  • 複製外掛程式會以 1MB 的封包加上中繼資料傳輸資料。因此,捐贈者和接收者 MySQL 伺服器實例上的最小必需 max_allowed_packet 值為 2MB。max_allowed_packet 值小於 2MB 會導致錯誤。使用以下查詢來檢查您的 max_allowed_packet 設定

    mysql> SHOW VARIABLES LIKE 'max_allowed_packet';

以下先決條件也適用

  • 捐贈者上的撤銷表空間檔案名稱必須是唯一的。當資料複製到接收者時,撤銷表空間(無論它們在捐贈者上的位置為何)都會複製到接收者上的 innodb_undo_directory 位置,或是複製到 DATA DIRECTORY [=] 'clone_dir' 子句指定的目錄(如果使用)。因此,不允許捐贈者上出現重複的撤銷表空間檔案名稱。如果在複製操作期間遇到重複的撤銷表空間檔案名稱,則會報告錯誤。

    若要檢視捐贈者上的撤銷表空間檔案名稱以確保它們是唯一的,請查詢 FILES 資料表

    mysql> SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES
           WHERE FILE_TYPE LIKE 'UNDO LOG';

    有關刪除和新增撤銷表空間檔案的資訊,請參閱第 17.6.3.4 節「撤銷表空間」

  • 預設情況下,資料複製完成後,會自動重新啟動接收者 MySQL 伺服器實例(停止並啟動)。若要讓自動重新啟動發生,則接收者上必須有一個監控程序可用於偵測伺服器關閉。否則,複製操作會在複製資料後停止,並出現以下錯誤,而且接收者 MySQL 伺服器實例會關閉

    ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).

    這個錯誤並不表示複製失敗。它表示在複製資料後,必須手動重新啟動接收端的 MySQL 伺服器執行個體。手動啟動伺服器後,您可以連線到接收端的 MySQL 伺服器執行個體,並檢查 Performance Schema 的複製表格,以驗證複製操作是否成功完成(請參閱使用 Performance Schema 複製表格監控複製操作)。RESTART 陳述式也有相同的監控程序要求。如需更多資訊,請參閱章節 15.7.8.8,「RESTART 陳述式」。如果使用 DATA DIRECTORY 子句複製到具名目錄,則此要求不適用,因為在這種情況下不會執行自動重新啟動。

  • 有幾個變數控制遠端複製操作的各個方面。在執行遠端複製操作之前,請檢閱這些變數並根據您的計算環境調整設定。複製變數是在執行複製操作的接收端 MySQL 伺服器執行個體上設定的。請參閱章節 7.6.7.13,「複製系統變數」

複製遠端資料

以下範例示範如何複製遠端資料。依預設,遠端複製操作會移除接收端的使用者建立的資料(結構描述、表格、表格空間)和二進位記錄檔,將新資料複製到接收端資料目錄,然後重新啟動 MySQL 伺服器。

此範例假設已符合遠端複製的先決條件。請參閱遠端複製的先決條件

  1. 使用管理使用者帳戶登入捐贈端 MySQL 伺服器執行個體。

    1. 建立具有 BACKUP_ADMIN 權限的複製使用者。

      mysql> CREATE USER 'donor_clone_user'@'example.donor.host.com' IDENTIFIED BY 'password';
      mysql> GRANT BACKUP_ADMIN on *.* to 'donor_clone_user'@'example.donor.host.com';
    2. 安裝複製外掛程式

      mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
  2. 使用管理使用者帳戶登入接收端 MySQL 伺服器執行個體。

    1. 建立具有 CLONE_ADMIN 權限的複製使用者。

      mysql> CREATE USER 'recipient_clone_user'@'example.recipient.host.com' IDENTIFIED BY 'password';
      mysql> GRANT CLONE_ADMIN on *.* to 'recipient_clone_user'@'example.recipient.host.com';
    2. 安裝複製外掛程式

      mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
    3. 將捐贈端 MySQL 伺服器執行個體的主機位址新增至 clone_valid_donor_list 變數設定。

      mysql> SET GLOBAL clone_valid_donor_list = 'example.donor.host.com:3306';
  3. 以您先前建立的複製使用者 (recipient_clone_user'@'example.recipient.host.com) 登入接收端 MySQL 伺服器執行個體,並執行 CLONE INSTANCE 陳述式。

    mysql> CLONE INSTANCE FROM 'donor_clone_user'@'example.donor.host.com':3306
           IDENTIFIED BY 'password';

    資料複製後,接收端的 MySQL 伺服器執行個體會自動重新啟動。

    如需監控複製操作狀態和進度的相關資訊,請參閱章節 7.6.7.10,「監控複製操作」

複製到具名目錄

依預設,遠端複製操作會先從接收端資料目錄中移除使用者建立的資料(結構描述、表格、表格空間)和二進位記錄檔,然後再從捐贈端 MySQL 伺服器執行個體複製資料。透過複製到具名目錄,您可以避免從目前的接收端資料目錄中移除資料。

複製到具名目錄的程序與複製遠端資料中描述的程序相同,但有一個例外:CLONE INSTANCE 陳述式必須包含 DATA DIRECTORY 子句。例如

mysql> CLONE INSTANCE FROM 'user'@'example.donor.host.com':3306
       IDENTIFIED BY 'password'
       DATA DIRECTORY = '/path/to/clone_dir';

必須使用絕對路徑,而且該目錄不得存在。MySQL 伺服器必須具有建立目錄的必要寫入權限。

複製到具名目錄時,資料複製後,接收端 MySQL 伺服器執行個體不會自動重新啟動。如果您想要在具名目錄中重新啟動 MySQL 伺服器,您必須手動執行此操作

$> mysqld_safe --datadir=/path/to/clone_dir

其中 /path/to/clone_dir 是接收端具名目錄的路徑。

設定加密連線以進行複製

您可以為遠端複製操作設定加密連線,以保護透過網路複製的資料。複製加密資料時,依預設需要加密連線。(請參閱章節 7.6.7.5,「複製加密資料」。)

以下說明描述如何設定接收端 MySQL 伺服器執行個體以使用加密連線。假設捐贈端 MySQL 伺服器執行個體已設定為使用加密連線。如果沒有,請參閱章節 8.3.1,「設定 MySQL 以使用加密連線」以取得伺服器端設定指示。

若要設定接收端 MySQL 伺服器執行個體以使用加密連線

  1. 讓捐贈端 MySQL 伺服器執行個體的用戶端憑證和金鑰檔案可供接收端主機使用。使用安全通道將檔案分發到接收端主機,或將它們放置在接收端主機可存取的已掛載分割區上。要提供的用戶端憑證和金鑰檔案包括

    • ca.pem

      自簽署憑證授權單位 (CA) 檔案。

    • client-cert.pem

      用戶端公鑰憑證檔案。

    • client-key.pem

      用戶端私密金鑰檔案。

  2. 在接收端 MySQL 伺服器執行個體上設定下列 SSL 選項。

    例如

    clone_ssl_ca=/path/to/ca.pem
    clone_ssl_cert=/path/to/client-cert.pem
    clone_ssl_key=/path/to/client-key.pem
  3. 若要要求使用加密連線,請在接收端發出 CLONE 陳述式時,包含 REQUIRE SSL 子句。

    mysql> CLONE INSTANCE FROM 'user'@'example.donor.host.com':3306
           IDENTIFIED BY 'password'
           DATA DIRECTORY = '/path/to/clone_dir'
           REQUIRE SSL;

    如果未指定 SSL 子句,複製外掛程式會嘗試預設建立加密連線,如果加密連線嘗試失敗,則會退回使用未加密連線。

    注意

    如果您正在複製加密資料,則預設需要加密連線,無論是否指定 REQUIRE SSL 子句。如果您嘗試複製加密資料,使用 REQUIRE NO SSL 會導致錯誤。