MySQL Clone Plugin

一、clone插件介紹

  MySQL 從8.0.17開始支持克隆插件,允許在本地或遠程 MySQL 實例在線克隆數據。克隆數據是存儲在 InnoDB 其中的數據的物理快照,其中包括庫、表、表空間和數據字典元數據。克隆的數據包含一個功能齊全的數據目錄,允許使用克隆插件進行 MySQL 服務器配置。
克隆插件支持兩種克隆方式:

  • 本地克隆:本地克隆操作將啓動克隆操作的 MySQL 服務器實例中的數據克隆到同服務器或同節點上的一個目錄裏。
    在這裏插入圖片描述
  • 遠程克隆操作涉及啓動克隆操作的本地MySQL服務器實例(“接收者”)和源數據所在的遠程MySQL服務器實例( “捐贈者”)。在接收者上啓動遠程克隆操作時,克隆的數據會通過網絡從捐贈者傳輸到接收者。默認情況下,遠程克隆操作會刪除接收者數據目錄中的數據,並將其替換爲克隆的數據。(可選)可以將數據克隆到接收者的其他目錄中,以避免刪除現有數據。
    在這裏插入圖片描述
      遠程克隆操作和本地克隆操作克隆的數據沒有區別,數據是相同的。克隆插件支持複製。除克隆數據外,克隆操作還從捐贈者中提取並傳輸複製位置信息,並將其應用於接受者,從而可以使用克隆插件來配置組複製或主從複製。使用克隆插件進行配置比複製大量事務要快得多,效率更高。

二、安裝克隆插件

  插件庫文件必須位於MySQL插件目錄(由plugin_dir系統變量命名的目錄)中,插件庫文件的基本名稱爲 mysql_clone.so。文件名後綴因平臺.so而異(例如,對於Unix和類似Unix的系統,.dll對於Windows。

root@mysql 14:12:  [(none)]> show variables like '%plugin_dir%';
+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| plugin_dir    | /var/soft/mysql/lib/plugin/ |
+---------------+-----------------------------+
1 row in set (0.01 sec)

  要在服務器啓動時加載插件,請使用–plugin-load-add選項來命名包含該插件 的庫文件。使用此插件加載方法,每次服務器啓動時都必須給出該選項。例如,將這些行放在my.cnf 文件中,並.so根據需要調整平臺的後綴:

#--plugin-load-add在從以前的MySQL版本升級期間重新啓動服務器時,無法使用該選項加​​載克隆插件。例如,將二進制文件或程序包從MySQL 5.7升級到MySQL 8.0後,嘗試重新啓動服務器 plugin-load-add=mysql_clone.so 會導致以下錯誤:[ERROR] [MY-013238] [Server]安裝插件'clone'時出錯:升級期間無法安裝。解決方法是在嘗試使用啓動服務器之前先升級服務器 plugin-load-add=mysql_clone.so。
[mysqld]
plugin-load-add=mysql_clone.so

  使用INSTALL PLUGIN加載插件,並將其註冊到mysql.plugins 系統表中,以使插件在每次後續的正常服務器啓動時都加載,而無需 --plugin-load-add。

root@mysql 14:12:  [(none)]> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
Query OK, 0 rows affected (0.01 sec)
root@mysql 14:12:  [(none)]> SELECT * FROM INFORMATION_SCHEMA.PLUGINS        WHERE PLUGIN_NAME = 'clone'\G
*************************** 1. row ***************************
           PLUGIN_NAME: clone
        PLUGIN_VERSION: 1.0
         PLUGIN_STATUS: ACTIVE
           PLUGIN_TYPE: CLONE
   PLUGIN_TYPE_VERSION: 1.0
        PLUGIN_LIBRARY: mysql_clone.so
PLUGIN_LIBRARY_VERSION: 1.10
         PLUGIN_AUTHOR: Oracle Corporation
    PLUGIN_DESCRIPTION: CLONE PLUGIN
        PLUGIN_LICENSE: GPL
           LOAD_OPTION: ON

root@mysql 14:12:  [(none)]> show variables like '%clone%';
+-----------------------------+---------+
| Variable_name               | Value   |
+-----------------------------+---------+
| clone_autotune_concurrency  | ON      |
| clone_buffer_size           | 4194304 |
| clone_ddl_timeout           | 300     |
| clone_enable_compression    | OFF     |
| clone_max_concurrency       | 16      |
| clone_max_data_bandwidth    | 0       |
| clone_max_network_bandwidth | 0       |
| clone_ssl_ca                |         |
| clone_ssl_cert              |         |
| clone_ssl_key               |         |
| clone_valid_donor_list      |         |
+-----------------------------+---------+
11 rows in set (0.00 sec)

三、克隆數據

3.1 克隆本地數據

  擁有BACKUP_ADMIN權限才能執行CLONE LOCAL DATA DIRECTORY的語句。

root@mysql 14:42:  [(none)]> create user clone_user;
Query OK, 0 rows affected (0.01 sec)

root@mysql 14:42:  [(none)]> GRANT BACKUP_ADMIN ON *.* TO 'clone_user';
Query OK, 0 rows affected (0.01 sec)

  clone插件支持以下用於在本地克隆數據的語法:將數據從本地MySQL數據目錄克隆到運行MySQL服務器實例的同一服務器或節點上的另一個目錄:

clone_user@mysql 14:48:  [(none)]> CLONE LOCAL DATA DIRECTORY = '/data/mysql/clone';
Query OK, 0 rows affected (1 min 23.15 sec)

  其中/data/mysql/clone是將數據克隆到的本地目錄的完整路徑。絕對路徑是必需的,並且指定的目錄(“ clone_dir”)一定不存在,但是指定的路徑必須是存在的路徑。MySQL服務器必須具有創建目錄所需的寫權限。
  克隆目錄可以直接作爲數據目錄啓動數據庫。

[root@zijie mysql]#  mv data/ data_bak
[root@zijie mysql]#  mv clone/ data/
[root@zijie mysql]#  mysqld_safe --defaults-file=/etc/my.cnf &
root@mysql 17:39:  [performance_schema]> select * from clone_status;
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------+
| ID   | PID  | STATE     | BEGIN_TIME              | END_TIME                | SOURCE         | DESTINATION    | ERROR_NO | ERROR_MESSAGE | BINLOG_FILE   | BINLOG_POSITION | GTID_EXECUTED                               |
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------+
|    1 |    0 | Completed | 2020-12-27 15:01:31.205 | 2020-12-27 15:10:08.372 | LOCAL INSTANCE | LOCAL INSTANCE |        0 |               | binlog.000013 |             196 | 594f981f-43ac-11eb-abbb-00163e0c8a51:1-2101 |
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------+
1 row in set (0.01 sec)

root@mysql 17:39:  [performance_schema]> select * from clone_progress;
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+
| ID   | STAGE     | STATE     | BEGIN_TIME                 | END_TIME                   | THREADS | ESTIMATE   | DATA       | NETWORK | DATA_SPEED | NETWORK_SPEED |
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+
|    1 | DROP DATA | Completed | 2020-12-27 15:01:31.204701 | 2020-12-27 15:01:31.213885 |       1 |          0 |          0 |       0 |          0 |             0 |
|    1 | FILE COPY | Completed | 2020-12-27 15:01:31.213946 | 2020-12-27 15:02:15.155140 |       2 | 2357319361 | 2357319361 |       0 |          0 |             0 |
|    1 | PAGE COPY | Completed | 2020-12-27 15:02:15.155312 | 2020-12-27 15:02:15.460111 |       2 |          0 |          0 |       0 |          0 |             0 |
|    1 | REDO COPY | Completed | 2020-12-27 15:02:15.460294 | 2020-12-27 15:02:15.661953 |       2 |       3072 |       3072 |       0 |          0 |             0 |
|    1 | FILE SYNC | Completed | 2020-12-27 15:02:15.662069 | 2020-12-27 15:02:58.471690 |       2 |          0 |          0 |       0 |          0 |             0 |
|    1 | RESTART   | Completed | 2020-12-27 15:02:58.471690 | 2020-12-27 15:10:01.386918 |       0 |          0 |          0 |       0 |          0 |             0 |
|    1 | RECOVERY  | Completed | 2020-12-27 15:10:01.386918 | 2020-12-27 15:10:08.371822 |       0 |          0 |          0 |       0 |          0 |             0 |
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+
7 rows in set (0.00 sec)

3.2 克隆遠程數據

  clone插件支持從遠程MySQL服務器實例(捐贈者)克隆數據,並將其傳輸到發起克隆操作的MySQL實例(接受者)。

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

#DATA DIRECTORY [=] 'clone_dir'是一個可選子句,用於指定接受者上要克隆的數據的目錄。如果不想刪除接受者數據目錄中的現有數據,可以使用此選項。必須使用絕對路徑,且目錄必須不存在。MySQL服務器必須具有創建目錄所需的寫權限。如果不使用optional子句,則克隆操作將刪除接受者數據目錄中的現有數據,將其替換爲克隆的數據,然後自動重新啓動服務器。 
#[REQUIRE [NO] SSL]指定在通過網絡傳輸克隆數據時是否使用加密連接。如果無法滿足顯式規範,則返回錯誤。如果未指定SSL子句,則克隆會默認嘗試建立加密連接,如果安全連接嘗試失敗,則會回退到不安全的連接。無論是否指定此子句,克隆加密數據時都需要安全連接。

  要執行克隆操作,克隆插件必須在捐贈者和和接收者MySQL服務器實例上均處於活動狀態。執行克隆操作需要捐贈者和和接收者上的MySQL用戶。

  • 在捐贈者上,克隆用戶需要 BACKUP_ADMIN特權才能訪問和傳輸來自捐贈者的數據,並在克隆操作期間阻止DDL。
  • 在接收者上,克隆用戶需要具有以下 CLONE_ADMIN特權:替換接收者的數據,在克隆操作期間阻止DDL以及自動重新啓動服務器。CLONE_ADMIN權限包括BACKUP_ADMIN和 SHUTDOWN隱含的權限。

注意:

  • 捐贈者和接收者必須具有相同的MySQL服務器版本。MYSQL 8.0.17及更高版本支持clone插件。

  • 捐贈者和接收者MySQL服務器實例必須在相同的操作系統和平臺上運行。

  • 接收者必須具有足夠的磁盤空間來存儲克隆的數據。默認情況下,在克隆供體數據之前會刪除接收者的數據,因此只需要足夠的空間即可存儲捐贈者數據。如果使用該DATA DIRECTORY子句克隆到命名目錄,則必須有足夠的磁盤空間用於現有的接收者的數據和克隆的數據。

  • InnoDB允許在數據目錄之外創建一些表空間類型。如果捐贈者MySQL服務器實例的表空間位於數據目錄之外,則克隆操作必須能夠訪問這些表空間。可以查詢 INFORMATION_SCHEMA.FILES 表以標識駐留在數據目錄之外的表空間。駐留在數據目錄之外的文件具有到數據目錄以外的目錄的標準路徑。

  • 在捐贈者上活動的插件(包括任何密鑰插件)也必須在接收者上活動。您可以通過發佈SHOW PLUGINS語句或查詢 INFORMATION_SCHEMA.PLUGINS 表來標識活動插件 。

  • 捐贈者和接受者必須具有相同的MySQL服務器字符集和排序規則。

  • 捐贈者和接受者必須具有相同的innodb_page_size和innodb_data_file_path。

  • 如果克隆加密或頁面壓縮的數據,則捐贈者和接受者必須具有相同的文件系統塊大小。

  clone_valid_donor_list 參數需要在接收者設置,值爲捐贈者MySQL服務器實例的主機地址。只能從有效捐贈者列表上的主機克隆數據。
  一次只能進行一次克隆操作。要確定克隆操作是否正在運行,可以查詢 clone_status表。
  克隆插件以1MB數據包以及元數據的形式傳輸數據。因此,在捐助者和接收者MySQL服務器實例上的最低要求max_allowed_packet值爲2MB。max_allowed_packet小於2MB的 值將導致錯誤。使用以下查詢來檢查您的 max_allowed_packet 設置:
  捐贈者上的undo表空間文件名必須唯一。當將數據克隆到接收者時,undo表空間(無論在捐贈者上的位置如何)都將克隆到innodb_undo_directory 接收者的位置或子句指定的目錄(如果使用)中。因此,不允許在施主上使用重複的undo表空間文件名。從MySQL 8.0.18開始,如果在克隆操作期間遇到重複的undo表空間文件名,則會報告錯誤。在MySQL 8.0.18之前,克隆具有相同文件名的undo表空間可能導致undo表空間文件在接收者上被覆蓋。
  默認情況下,克隆數據後,接收者MySQL服務器實例將自動重新啓動(停止和啓動)。爲了進行自動重啓,接收者上必須有一個監視過程來檢測服務器關閉。否則,在克隆數據並關閉接收方MySQL服務器實例後,克隆操作會因以下錯誤而暫停:
ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
  此錯誤並不表示克隆失敗。這意味着克隆數據後,必須再次手動啓動接收者MySQL服務器實例。手動啓動服務器後,可以連接到接收者MySQL服務器實例,並檢查克隆操作是否成功完成。
示例:






捐贈者:
CREATE USER 'donor_clone_user'@'%' IDENTIFIED BY '123456';
GRANT BACKUP_ADMIN on *.* to 'donor_clone_user'@'%';
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
接受者:
CREATE USER 'recipient_clone_user'@'%' IDENTIFIED BY '123456';
GRANT CLONE_ADMIN on *.* to 'recipient_clone_user'@'%';
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
SET GLOBAL clone_valid_donor_list = '127.0.0.1:3306';

#在接收者執行
root@mysql 17:36:  [(none)]> CLONE INSTANCE FROM 'donor_clone_user'@'127.0.0.1':3306 IDENTIFIED BY '123456';
Query OK, 0 rows affected (1 min 1.33 sec)

root@mysql 17:37:  [(none)]> Restarting mysqld...
2020-12-27T09:37:35.504997Z mysqld_safe Number of processes running now: 0
2020-12-27T09:37:35.509610Z mysqld_safe mysqld restarted
root@mysql 17:38:  [performance_schema]> select * from clone_progress;
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
| ID   | STAGE     | STATE     | BEGIN_TIME                 | END_TIME                   | THREADS | ESTIMATE   | DATA       | NETWORK    | DATA_SPEED | NETWORK_SPEED |
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
|    1 | DROP DATA | Completed | 2020-12-27 17:36:31.099998 | 2020-12-27 17:36:31.479585 |       1 |          0 |          0 |          0 |          0 |             0 |
|    1 | FILE COPY | Completed | 2020-12-27 17:36:31.479697 | 2020-12-27 17:36:51.912601 |       2 | 1128502977 | 1128502977 | 1128571265 |          0 |             0 |
|    1 | PAGE COPY | Completed | 2020-12-27 17:36:51.912710 | 2020-12-27 17:36:52.319905 |       2 |          0 |          0 |        197 |          0 |             0 |
|    1 | REDO COPY | Completed | 2020-12-27 17:36:52.320053 | 2020-12-27 17:36:52.620652 |       2 |       3584 |       3584 |       4079 |          0 |             0 |
|    1 | FILE SYNC | Completed | 2020-12-27 17:36:52.620782 | 2020-12-27 17:37:32.412985 |       2 |          0 |          0 |          0 |          0 |             0 |
|    1 | RESTART   | Completed | 2020-12-27 17:37:32.412985 | 2020-12-27 17:37:35.863105 |       0 |          0 |          0 |          0 |          0 |             0 |
|    1 | RECOVERY  | Completed | 2020-12-27 17:37:35.863105 | 2020-12-27 17:37:37.250319 |       0 |          0 |          0 |          0 |          0 |             0 |
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
7 rows in set (0.01 sec)

root@mysql 17:39:  [performance_schema]> select * from clone_status;
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------------------------------------------------+
| ID   | PID  | STATE     | BEGIN_TIME              | END_TIME                | SOURCE         | DESTINATION    | ERROR_NO | ERROR_MESSAGE | BINLOG_FILE   | BINLOG_POSITION | GTID_EXECUTED                                                                         |
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------------------------------------------------+
|    1 |    0 | Completed | 2020-12-27 17:36:31.085 | 2020-12-27 17:37:37.250 | 127.0.0.1:3306 | LOCAL INSTANCE |        0 |               | binlog.000014 |            1278 | 594f981f-43ac-11eb-abbb-00163e0c8a51:1-2101,
8e07f60e-4812-11eb-b202-00163e0c8a51:1-5 |
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

#克隆到指定目錄
root@mysql 17:47:  [performance_schema]> select * from clone_progress;
+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
| ID   | STAGE     | STATE       | BEGIN_TIME                 | END_TIME                   | THREADS | ESTIMATE   | DATA       | NETWORK    | DATA_SPEED | NETWORK_SPEED |
+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
|    1 | DROP DATA | Completed   | 2020-12-27 17:42:02.556278 | 2020-12-27 17:42:02.688091 |       1 |          0 |          0 |          0 |          0 |             0 |
|    1 | FILE COPY | Completed   | 2020-12-27 17:42:02.688182 | 2020-12-27 17:42:23.207776 |       2 | 1128388289 | 1128388289 | 1128456442 |          0 |             0 |
|    1 | PAGE COPY | Completed   | 2020-12-27 17:42:23.207910 | 2020-12-27 17:42:23.519334 |       2 |          0 |          0 |        197 |          0 |             0 |
|    1 | REDO COPY | Completed   | 2020-12-27 17:42:23.519444 | 2020-12-27 17:42:23.819936 |       2 |       3584 |       3584 |       4079 |          0 |             0 |
|    1 | FILE SYNC | Completed   | 2020-12-27 17:42:23.820066 | 2020-12-27 17:43:03.065116 |       2 |          0 |          0 |          0 |          0 |             0 |
|    1 | RESTART   | Not Started | NULL                       | NULL                       |       0 |          0 |          0 |          0 |          0 |             0 |
|    1 | RECOVERY  | Not Started | NULL                       | NULL                       |       0 |          0 |          0 |          0 |          0 |             0 |
+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
7 rows in set (0.00 sec)

root@mysql 17:47:  [performance_schema]> select * from clone_status;
+------+------+-----------+-------------------------+-------------------------+----------------+------------------------+----------+---------------+-------------+-----------------+---------------+
| ID   | PID  | STATE     | BEGIN_TIME              | END_TIME                | SOURCE         | DESTINATION            | ERROR_NO | ERROR_MESSAGE | BINLOG_FILE | BINLOG_POSITION | GTID_EXECUTED |
+------+------+-----------+-------------------------+-------------------------+----------------+------------------------+----------+---------------+-------------+-----------------+---------------+
|    1 |   11 | Completed | 2020-12-27 17:42:02.383 | 2020-12-27 17:43:03.065 | 127.0.0.1:3306 | /data/mysql/clone_dir/ |        0 |               |             |               0 |               |
+------+------+-----------+-------------------------+-------------------------+----------------+------------------------+----------+---------------+-------------+-----------------+---------------+
1 row in set (0.01 sec)

3.3 基於clone建立複製

  克隆插件支持複製。除了克隆數據之外,克隆操作還從捐贈者提取複製位點並將其傳遞給接收者,從而可以使用克隆插件來配置組複製成員和副本。與複製大量事務相比,使用克隆插件進行配置要快得多,效率也更高。在克隆操作期間,二進制日誌位置(文件名,偏移量)和 gtid_executed提取GTID集,並將其從捐贈者MySQL服務器實例傳輸到接收者。此數據允許在複製流中的一致位置啓動複製。二進制日誌和中繼日誌(保存在文件中)不會從捐贈者複製到收件人。要啓動複製,在克隆數據的時間和開始複製的時間之間,不能清除接收者追趕捐贈者所需的二進制日誌。如果所需的二進制日誌不可用,則會報告複製握手錯誤。因此,應將克隆的實例添加到複製組中,而不會產生過多的延遲,以避免清除必需的二進制日誌或新成員明顯滯後。還可以將組複製成員配置爲使用克隆插件作爲分佈式恢復的選項,在這種情況下,加入成員會自動選擇最有效的方式從現有組成員中檢索組數據。

root@mysql 17:57:  [(none)]> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
+---------------+-----------------+
| BINLOG_FILE   | BINLOG_POSITION |
+---------------+-----------------+
| binlog.000014 |            1459 |
+---------------+-----------------+
1 row in set (0.00 sec)

root@mysql 17:57:  [(none)]> SELECT @@GLOBAL.GTID_EXECUTED;
+---------------------------------------------------------------------------------------+
| @@GLOBAL.GTID_EXECUTED                                                                |
+---------------------------------------------------------------------------------------+
| 594f981f-43ac-11eb-abbb-00163e0c8a51:1-2101,
8e07f60e-4812-11eb-b202-00163e0c8a51:1-6 |
+---------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
CHANGE MASTER TO MASTER_HOST ='127.0.0.1',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_PORT=3306,MASTER_AUTO_POSITION = 1;

  在MySQL 8.0中,默認情況下,複製元數據存儲庫保存在表中,這些表在克隆操作期間從捐贈者複製到接收者。複製元數據存儲庫包含與複製相關的配置設置,可用於在克隆操作之後正確地恢復複製。

  • 在MySQL 8.0.17和8.0.18中,僅mysql.slave_master_info複製表 (連接元數據存儲庫)。
  • 從MySQL 8.0.19,還複製了表mysql.slave_relay_log_info(應用程序元數據存儲庫)和表 (應用程序 mysql.slave_worker_info工作者元數據存儲庫)。
      對於基於GTID的複製,如果接收者被配置有 gtid_mode=ON和已經從捐贈者克隆與 gtid_mode=ON, ON_PERMISSIVE或 OFF_PERMISSIVE,將 gtid_executed來自捐贈者GTID集在接收方應用。如果接收者是從副本已經在拓撲克隆,接收者的複製渠道GTID使用自動定位(由指定 MASTER_AUTO_POSITION的選項 CHANGE MASTER TO 語句)可以在通道啓動克隆操作後自動恢復複製。如果您只想使用這些相同的通道,則無需執行任何手動設置。
      對於基於二進制日誌文件位置的複製,如果接收者位於MySQL 8.0.17或8.0.18,則來自捐贈者的二進制日誌位置不會應用於接收者,僅記錄在clone_status表中。因此,必須手動設置使用二進制日誌文件基於位置的複製的接收者上的複製通道,以在克隆操作後恢復複製。確保這些通道沒有配置爲在服務器啓動時自動啓動複製,因爲它們還沒有二進制日誌位置,並嘗試從頭開始複製。
      對於基於二進制日誌文件位置的複製,如果接收者使用的是MySQL 8.0.19或更高版本,則將來自捐贈者的二進制日誌位置應用於接受者。接收者上使用基於二進制日誌文件位置的複製的複製通道在重新啓動複製之前,會使用克隆的中繼日誌信息自動嘗試執行中繼日誌恢復過程。對於單線程副本(slave_parallel_workers 設置爲0),中繼日誌恢復應該在沒有其他問題的情況下成功完成,從而使通道無需進一步設置即可恢復複製。對於多線程副本(slave_parallel_workers 大於0),則中繼日誌恢復很可能會失敗,因爲它通常無法自動完成。在這種情況下,將發出錯誤消息,並且您必須手動設置通道。


四、clone運維相關

4.1 相關文件

  克隆數據後,將創建以下目錄和文件以供內部使用。它們不應該被修改。
#clone:包含克隆操作使用的內部克隆文件。在要克隆數據的目錄中創建。
#ib_archive:包含內部存檔的日誌文件,該日誌文件在克隆操作期間存檔在捐贈者上。
*.#clone files:當現有數據目錄被遠程克隆操作替換時,在收件人上創建的臨時數據文件。


4.2 故障處理

  • 採取備用鎖定來阻止DDL操作。
  • 如果克隆操作在clone_ddl_timeout 變量指定的時限內無法獲得DDL鎖定 ,則會報告錯誤。
  • 在將數據克隆到接收者數據目錄之前,將刪除收件人上用戶創建的數據和二進制日誌。
  • 在遠程克隆操作期間從接收者中刪除用戶創建的數據時,接收者數據目錄中的現有數據不會保存,並且如果發生故障可能會丟失。如果要替換接收者上的數據很重要,則應在啓動遠程克隆操作之前進行備份。警告會打印到服務器錯誤日誌中,以指定何時開始和結束數據刪除:
[Warning] [MY-013453] [InnoDB] Clone removing all user data for provisioning:
Started...
[Warning] [MY-013453] [InnoDB] Clone removing all user data for provisioning:
Finished

  如果在刪除數據時發生故障,則在克隆操作之前,接收者可能會剩下一部分模式,表和表空間。在執行克隆操作期間或發生故障之後的任何時間,服務器始終處於一致狀態。
  從捐贈者克隆數據。克隆了用戶創建的數據,字典元數據和其他系統數據。如果在克隆數據時發生故障,則回滾克隆操作並刪除所有克隆的數據。在此階段,還刪除了接受者上先前存在的數據,這使接收者沒有用戶數據。
  如果發生這種情況,可以糾正故障原因並重新執行克隆操作,也可以放棄克隆操作並從克隆操作之前進行的備份中還原接收者數據。
  服務器自動重新啓動(適用於不克隆到命名目錄的遠程克隆操作)。在啓動期間,將執行典型的服務器啓動任務。如果服務器自動重啓失敗,則可以手動重啓服務器以完成克隆操作。
  如果在克隆操作期間發生網絡錯誤,並且在五分鐘內解決了錯誤,則操作將恢復。否則,該操作將中止並返回錯誤。



4.3 clone監控

  接收者使用clone_status和 clone_progress表來監視克隆操作

  • clone_status表提供了當前或上次執行的克隆操作的狀態。克隆操作有四種可能的狀態: Not Started,In Progress,Completed,和 Failed。
  • clone_progress表按階段提供了當前或上次執行的克隆操作的進度信息。克隆操作的各個階段包括DROP DATA, FILE COPY, PAGE_COPY, REDO_COPY, FILE_SYNC,RESTART,和RECOVERY。

  捐贈者需要通過Performance Schema下的事件表進行監控

  • stage/innodb/clone (file copy):指示克隆操作的文件複製階段的進度。 WORK_ESTIMATED和 WORK_COMPLETED單位是文件塊。在文件複製階段開始時就知道要傳輸的文件數,並且基於文件數來估計塊數。 WORK_ESTIMATED設置爲估計的文件塊數。WORK_COMPLETED 發送每個塊後更新。

  • stage/innodb/clone (page copy):指示克隆操作的頁面複製階段的進度。WORK_ESTIMATED和 WORK_COMPLETED單位是頁面。一旦完成文件複製階段,就知道要傳輸的頁數,並將 WORK_ESTIMATED其設置爲該值。 WORK_COMPLETED發送每頁後更新。

  • stage/innodb/clone (redo copy):指示克隆操作的重做複製階段的進度。WORK_ESTIMATED和 WORK_COMPLETED單位是重做塊。一旦頁面複製階段完成,就知道要傳輸的重做塊的數量,並將 WORK_ESTIMATED其設置爲該值。 WORK_COMPLETED發送每個塊後更新。

UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/clone%';
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
root@mysql 18:30:  [(none)]> SELECT * FROM performance_schema.setup_instruments WHERE  NAME LIKE '%clone%';
+----------------------------------------------+---------+-------+------------+------------+---------------+
| NAME                                         | ENABLED | TIMED | PROPERTIES | VOLATILITY | DOCUMENTATION |
+----------------------------------------------+---------+-------+------------+------------+---------------+
| wait/synch/mutex/innodb/clone_snapshot_mutex | NO      | NO    |            |          0 | NULL          |
| wait/synch/mutex/innodb/clone_sys_mutex      | NO      | NO    |            |          0 | NULL          |
| wait/synch/mutex/innodb/clone_task_mutex     | NO      | NO    |            |          0 | NULL          |
| wait/io/file/innodb/innodb_clone_file        | YES     | YES   |            |          0 | NULL          |
| stage/innodb/clone (file copy)               | YES     | YES   | progress   |          0 | NULL          |
| stage/innodb/clone (redo copy)               | YES     | YES   | progress   |          0 | NULL          |
| stage/innodb/clone (page copy)               | YES     | YES   | progress   |          0 | NULL          |
| statement/abstract/clone                     | YES     | YES   | mutable    |          0 | NULL          |
| statement/clone/local                        | YES     | YES   |            |          0 | NULL          |
| statement/clone/client                       | YES     | YES   |            |          0 | NULL          |
| statement/clone/server                       | YES     | YES   |            |          0 | NULL          |
| memory/innodb/clone                          | YES     | NULL  |            |          0 | NULL          |
| memory/clone/data                            | YES     | NULL  |            |          0 | NULL          |
+----------------------------------------------+---------+-------+------------+------------+---------------+
13 rows in set (0.00 sec)
root@mysql 18:27:  [performance_schema]> SELECT EVENT_NAME,WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history WHERE EVENT_NAME LIKE 'stage/innodb/clone%';
+--------------------------------+----------------+----------------+
| EVENT_NAME                     | WORK_COMPLETED | WORK_ESTIMATED |
+--------------------------------+----------------+----------------+
| stage/innodb/clone (file copy) |           1077 |           1077 |
| stage/innodb/clone (page copy) |              0 |              0 |
| stage/innodb/clone (redo copy) |              1 |              1 |
+--------------------------------+----------------+----------------+
3 rows in set (0.00 sec)
root@mysql 18:29:  [(none)]> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current WHERE EVENT_NAME LIKE 'stage/innodb/clone%';
+--------------------------------+----------------+----------------+
| EVENT_NAME                     | WORK_COMPLETED | WORK_ESTIMATED |
+--------------------------------+----------------+----------------+
| stage/innodb/clone (file copy) |            520 |           1077 |
+--------------------------------+----------------+----------------+
1 row in set (0.01 sec)

相關等待事件:

  • wait/synch/mutex/innodb/clone_snapshot_mutex:跟蹤克隆快照互斥鎖的等待事件,該事件在多個克隆線程之間同步對動態快照對象(在施主和受主上)的訪問。
  • wait/synch/mutex/innodb/clone_sys_mutex:跟蹤克隆sys互斥鎖的等待事件。MySQL服務器實例中有一個克隆系統對象。此互斥鎖同步對供體和收件人上的克隆系統對象的訪問。它是由克隆線程以及其他前臺和後臺線程獲取的。
  • wait/synch/mutex/innodb/clone_task_mutex:跟蹤克隆任務互斥鎖的等待事件,該事件用於克隆任務管理。該 clone_task_mutex被克隆的線程收購。
  • wait/io/file/innodb/innodb_clone_file:跟蹤克隆所操作的文件的所有I / O等待操作。

4.4 clone插件限制

  • 克隆操作期間不允許使用 DDL。允許併發DML。
  • 無法從其他MySQL服務器版本或發行版克隆實例。捐贈者和接受者必須具有完全相同的MySQL服務器版本和發行版。例如,無法在MySQL 5.7和MySQL 8.0之間或MySQL 8.0.19和MySQL 8.0.20之間進行克隆。僅MySQL 8.0.17及更高版本支持clone插件。
  • 一次只能克隆一個MySQL實例。不支持在單個克隆操作中克隆多個MySQL實例。
  • mysqlx_port遠程克隆操作(在CLONE INSTANCE語句中指定施主MySQL服務器實例的端口號時)不支持 由指定的X協議端口 。
  • clone插件不支持MySQL服務器配置的克隆。。
  • clone插件不支持二進制日誌的克隆。
  • clone插件僅克隆存儲在中的數據 InnoDB。其他存儲引擎數據未克隆。MyISAM和 CSV存儲在任何架構,包括表sys架構中克隆爲空表。
  • 不支持通過MySQL router連接到捐贈者MySQL服務器實例。
  • 本地克隆操作不支持克隆使用絕對路徑創建的常規表空間。與源表空間文件具有相同路徑的克隆表空間文件將導致衝突。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章