MySQL8.0Clone插件

簡介

Clone插件可以克隆數據到本機其他目錄,也可以從遠端MySQL實例克隆數據到本機。克隆的數據是一個物理的快照,包含在InnoDB中存儲的schema,tables,tablespaces以及數據目錄元數據。Clone插件除了克隆數據外,克隆操作還可以從donor獲取複製位點,並將其應用於recipient,這使得可以使用clone插件來提供組複製成員和主從複製。使用clone plugin要比正常做主從備份恢復數據快得多,效率也高得多 。

  • 本地克隆:克隆數據到MySQL服務器實例運行的同一服務器的目錄。
  • 遠程克隆:遠程克隆中有2個角色,負責接受克隆數據的recipient(受體),負責發送數據的donor(捐助人),當recipient啓動clone,donor通過網絡將數據傳輸給recipient,這個操作會刪除recipient原數據目錄下的文件,並用克隆過來的數據代替它,如果需要保留原有數據,可以將數據複製到recipient的另一個目錄,避免刪除原有數據。

安裝插件

配置文件

配置文件中加一項配置,如下:

[mysqld]
plugin-load-add=mysql_clone.so

如果clone插件很重要,clone加載失敗,則MySQL也必須啓動失敗,可以參考如下配置

[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT

運行時安裝插件

使用下面方式安裝重啓配置也不會丟失,因爲在安裝成功後配置都已經註冊到 mysql.plugins系統表中。

mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';

查看是否安裝成功

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME = 'clone';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone       | ACTIVE        |
+-------------+---------------+
1 row in set (0.00 sec)

plugin_status爲active表示啓動成功。

#本地克隆

語法如下:

CLONE LOCAL DATA DIRECTORY [=] 'clone_dir';

使用本地克隆需要有BACKUP_ADMIN權限,權限配置參考如下:

mysql> GRANT BACKUP_ADMIN ON *.* TO 'clone_user';

本地克隆示例

mysql> CLONE LOCAL DATA DIRECTORY = '/path/to/clone_dir';

其中/path/to/clone_dir是數據被克隆到的本地目錄的完整路徑。指定的目錄clone_dir必須不存在。

遠程克隆

語法如下:

CLONE INSTANCE FROM 'user'@'host':port
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];
  • user:donor實例上的clone用戶
  • password:user的密碼
  • host:donor實例的ip/hostname地址
  • port:donor實例端口
  • DATA DIRECTORY [=] 'clone_dir':可選項,克隆數據到本地其他目錄,而不是當前數據目錄
  • REQUIRE [NO] SSL:是否啓用ssl加密

使用遠程克隆需要注意:

  • 在donor上,克隆用戶需要有BACKUP_ADMIN權限,以及在克隆操作期間阻塞DDL操作。
  • 在recipient,克隆用戶需要有CLONE_ADMIN權限,去替換原有的數據目錄,CLONE_ADMIN權限隱式地包含BACKUP_ADMIN和SHUTDOWN權限。
  • MySQL版本必須8.0.17或更高以上
  • donor與recipient必須運行在相同的平臺上,比如都是x86_64平臺,而不能跨平臺克隆
  • recipient磁盤空間必須足夠
  • donor與recipient必須使用相同的字符集以及排序規則
  • donor與recipient必須設置相同的innodb_data_file_path(必須設置相同數量,相同大小的文件)以及innodb_page_size可以通過SHOW VARIABLES LIKE 'innodb_page_size';以及SHOW VARIABLES LIKE 'innodb_data_file_path';來確認。
  • 需要配置clone_valid_donor_list變量,donor主機必須在這個列表中,否則失敗,可以通過SHOW VARIABLES LIKE 'clone_valid_donor_list';查看當前配置
  • 一次只允許一個clone操作。要確定是否存在正在運行克隆操作,請查詢performance_schema.clone_status表。
  • clone插件傳輸的包大小爲1MB,在donor與recipient中, max_allowed_packet最小設置爲2MB,可以通過SHOW VARIABLES LIKE 'max_allowed_packet';
  • 在donor上undo表空間文件名必須唯一,當數據被clone到recipient,undo表空間會複製到recipient的innodb_undo_directory目錄下。如果donor有多個undo在不同目錄下,切名稱相同,可能會發生問題。donor節點上可以通過SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE LIKE 'UNDO LOG';確定undo表空間文件名是否唯一

具體操作如下:

  1. donor上創建具有BACKUP_ADMIN權限用戶

    mysql> CREATE USER 'donor_clone_user'@'%'IDENTIFIED BY 'password';
    mysql> GRANT BACKUP_ADMIN on *.* to 'donor_clone_user'@'%';
    
  2. donor上安裝克隆插件

    mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
    
  3. recipient上創建CLONE_ADMIN權限用戶

    mysql> CREATE USER 'recipient_clone_user'@'%'IDENTIFIED BY 'password';
    mysql> GRANT CLONE_ADMIN on *.* to'recipient_clone_user'@'%';
    
  4. recipient上安裝clone插件

    mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
    
  5. recipient上添加donor主機地址到clone_valid_donor_list變量中

    mysql> SET GLOBAL clone_valid_donor_list = 'donor:3306';
    
  6. recipient上克隆遠端服務器數據

    mysql> CLONE INSTANCE FROM 'donor_clone_user'@'donor':3306 IDENTIFIED BY 'password';
    

如果是從遠端複製到本地的其他目錄示例:

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

克隆數據後,將創建以下目錄和文件在MySQL內部使用:

  • #clone:包含克隆操作使用的內部克隆文件。在要複製數據的目錄中創建。
  • #ib_archive:包含內部存檔的日誌文件,這些文件在克隆操作期間存檔在捐贈者上。
  • *.#clone files:當現有數據目錄被遠程克隆操作替換時,在recipient上創建的臨時數據文件。

監控

主要使用performance.clone_progress與``performance.clone_status`兩個表進行監控

performance.clone_progress

有關當前或上次執行的克隆操作的狀態信息。

mysql> SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
+-----------+-----------+----------------------------+
| stage     | state     | end_time                   |
+-----------+-----------+----------------------------+
| DROP DATA | Completed | 2019-01-27 22:45:43.141261 |
| FILE COPY | Completed | 2019-01-27 22:45:44.457572 |
| PAGE COPY | Completed | 2019-01-27 22:45:44.577330 |
| REDO COPY | Completed | 2019-01-27 22:45:44.679570 |
| FILE SYNC | Completed | 2019-01-27 22:45:44.918547 |
| RESTART   | Completed | 2019-01-27 22:45:48.583565 |
| RECOVERY  | Completed | 2019-01-27 22:45:49.626595 |
+-----------+-----------+----------------------------+

performance.clone_status

有關當前或上次執行的克隆操作的進度信息。

mysql> select * from performance_schema.clone_status\G
*************************** 1. row ***************************
             ID: 1
            PID: 0
          STATE: Completed
     BEGIN_TIME: 2020-04-05 10:26:01.852
       END_TIME: 2020-04-05 10:27:23.986
         SOURCE: 192.168.240.35:3306
    DESTINATION: LOCAL INSTANCE
       ERROR_NO: 0
  ERROR_MESSAGE:
    BINLOG_FILE: binlog.000001
BINLOG_POSITION: 1516
  GTID_EXECUTED: 2a6a4935-7747-11ea-b104-000c2953a6ed:1-5
1 row in set (0.00 sec)

Performance Schema Stage Events

clone操作可能需要一些時間才能完成,這取決於數據量和與數據傳輸相關的其他因素。有三個階段事件用於監視clone操作的進度。每個stage event報告WORK_COMPLETEDWORK_ESTIMATED值。

clone包含了以下stage events:

  • stage/innodb/clone (file copy): file copy階段的進度。WORK_ESTIMATEDWORK_COMPLETED單元是chunk。在file copy階段開始時就知道要傳輸的文件數量,並根據文件數量估計chunk的數量。WORK_ESTIMATED被設置爲估計的文件塊的數量。WORK_COMPLETED在每個clunk發送後更新。
  • stage/innodb/clone (page copy): page copy階段的進度。WORK_ESTIMATEDWORK_COMPLETED單元是page。一旦完成了file copy階段,就知道要傳輸的pages數量,並將WORK_ESTIMATED設置爲這個值。WORK_COMPLETED在發送每個頁面後更新。
  • stage/innodb/clone (redo copy): redo copy階段的進度。WORK_ESTIMATEDWORK_COMPLETED單元是redo chunks 。一旦page copy階段完成,就知道要傳輸的redo chunks的數量,並且WORK_ESTIMATED被設置爲這個值,WORK_COMPLETED在每個redo chunks發送後更新。

啓用stage/innodb/clone% instruments:

mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES'
       WHERE NAME LIKE 'stage/innodb/clone%';

啓用階段事件使用者表,其中包括events_stages_currentevents_stages_historyevents_stages_history_long

mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';

查看進度

mysql> 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 (redo copy) |              1 |              1 |
+--------------------------------+----------------+----------------+

如果克隆操作已經完成,可以查看events_stages_history

mysql> 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) |            301 |            301 |
| stage/innodb/clone (page copy) |              0 |              0 |
| stage/innodb/clone (redo copy) |              1 |              1 |
+--------------------------------+----------------+----------------+

Performance Schema Clone Instrumentation

可以通過performance schema來對clone操作的不同維度進行監控

mysql> SELECT NAME,ENABLED FROM performance_schema.setup_instruments WHERE NAME LIKE '%clone%';
+----------------------------------------------+---------+
| NAME                                         | ENABLED |
+----------------------------------------------+---------+
| wait/synch/mutex/innodb/clone_snapshot_mutex | NO      |
| wait/synch/mutex/innodb/clone_sys_mutex      | NO      |
| wait/synch/mutex/innodb/clone_task_mutex     | NO      |
| wait/io/file/innodb/innodb_clone_file        | YES     |
| stage/innodb/clone (file copy)               | YES     |
| stage/innodb/clone (redo copy)               | YES     |
| stage/innodb/clone (page copy)               | YES     |
| statement/abstract/clone                     | YES     |
| statement/clone/local                        | YES     |
| statement/clone/client                       | YES     |
| statement/clone/server                       | YES     |
| memory/innodb/clone                          | YES     |
| memory/clone/data                            | YES     |
+----------------------------------------------+---------+

Wait Instruments

  • wait/synch/mutex/innodb/clone_snapshot_mutex: 跟蹤clone snapshot mutex 的等待事件。
  • wait/synch/mutex/innodb/clone_sys_mutex: 跟蹤clone sys mutex 的等待事件。
  • wait/synch/mutex/innodb/clone_task_mutex: 跟蹤clone task mutex的等待事件
  • wait/io/file/innodb/innodb_clone_file: 跟蹤所有文件io等待操作

Stage Instruments

  • stage/innodb/clone (file copy): file copy階段
  • stage/innodb/clone (redo copy): redo copy 階段
  • stage/innodb/clone (page copy): page copy階段

Statement Instruments

  • statement/abstract/clone: 跟蹤任何clone statement event,然後將其歸類爲本地、客戶端或服務器操作類型。
  • statement/clone/local: 跟蹤本地克隆操作的clone statement event;在執行克隆本地語句時生成。
  • statement/clone/client: 跟蹤發生在recipient實例上的clone statement event;在recipient上執行clone語句時生成。
  • statement/clone/server: 跟蹤遠程clone statement event,發生在donor的MySQL服務器實例;在recipient上執行clone語句時生成。

Memory Instruments

  • memory/innodb/clone: 跟蹤InnoDB爲動態快照分配的內存。
  • memory/clone/data: 在clone期間跟蹤clone插件分配的內存。

Com_clone

查看clone執行的次數,show status like '%clone%';

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章