文章目錄
簡介
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表空間文件名是否唯一
具體操作如下:
-
donor上創建具有
BACKUP_ADMIN
權限用戶mysql> CREATE USER 'donor_clone_user'@'%'IDENTIFIED BY 'password'; mysql> GRANT BACKUP_ADMIN on *.* to 'donor_clone_user'@'%';
-
donor上安裝克隆插件
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
-
recipient上創建
CLONE_ADMIN
權限用戶mysql> CREATE USER 'recipient_clone_user'@'%'IDENTIFIED BY 'password'; mysql> GRANT CLONE_ADMIN on *.* to'recipient_clone_user'@'%';
-
recipient上安裝clone插件
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
-
recipient上添加donor主機地址到
clone_valid_donor_list
變量中mysql> SET GLOBAL clone_valid_donor_list = 'donor:3306';
-
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_COMPLETED
和WORK_ESTIMATED
值。
clone包含了以下stage events:
stage/innodb/clone (file copy)
: file copy階段的進度。WORK_ESTIMATED
和WORK_COMPLETED
單元是chunk。在file copy階段開始時就知道要傳輸的文件數量,並根據文件數量估計chunk的數量。WORK_ESTIMATED
被設置爲估計的文件塊的數量。WORK_COMPLETED
在每個clunk發送後更新。stage/innodb/clone (page copy)
: page copy階段的進度。WORK_ESTIMATED
和WORK_COMPLETED
單元是page。一旦完成了file copy階段,就知道要傳輸的pages數量,並將WORK_ESTIMATED
設置爲這個值。WORK_COMPLETED
在發送每個頁面後更新。stage/innodb/clone (redo copy)
: redo copy階段的進度。WORK_ESTIMATED
和WORK_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_current
、events_stages_history
和events_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%';