1. 程式人生 > >技術分享 | MySQL 8.0.17 如何用克隆外掛從頭開始建立一個例項副本

技術分享 | MySQL 8.0.17 如何用克隆外掛從頭開始建立一個例項副本

原創: 管長龍 譯 愛可生開源社群 昨天

作者:Vinicius Grippa

 

在這篇文章中,我們將討論一個新功能 —— MySQL 8.0.17 clone 外掛。在文章中,我將演示如何輕鬆地建立“經典”複製(一主一從),從頭開始構建備用副本。

克隆外掛允許在本地或從遠端 MySQL 伺服器例項克隆資料。在 InnoDB 中,克隆的資料是儲存在物理快照的資料,這意味著,例如,資料可用於建立備用副本。

讓我們親自動手,看看它是如何工作的。

 

MySQL 8.0.17 clone 外掛的安裝和驗證過程

安裝非常簡單,與安裝其他外掛的工作方式相同。下面是安裝克隆外掛的命令列:

master [localhost:45008] ((none)) > INSTALL PLUGIN clone SONAME 'mysql_clone.so';
Query OK, 0 rows affected (0.00 sec)

以及如何檢查克隆外掛是否處於活動狀態:

master [localhost:45008] ((none)) > SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'clone';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone | ACTIVE |
+-------------+---------------+
1 row in set (0.00 sec)

 

請注意,這些步驟需要在 Donor(供體)和 Recipient(受體,也成為 Slave)上都執行。

執行安裝後,外掛將在重新啟動後自動載入,因此您不必再擔心這一點。

接下來,我們將在 Donor 上建立具有必要許可權的使用者,這樣我們就可以遠端連線到例項來克隆它。

master [localhost:45008] ((none)) > create user clone_user@'%' identified by 'sekret';
Query OK, 0 rows affected (0.01 sec)

master [localhost:45008] ((none)) > GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'%';
Query OK, 0 rows affected (0.00 sec)

作為安全措施,我建議將百分號 % 替換為從機的 IP、主機名或網路掩碼,以便只有未來的從伺服器才能接受連線。現在,從伺服器上,克隆使用者需要CLONE_ADMIN 許可權來替換從機資料,在克隆操作期間阻止 DDL 並自動重新啟動伺服器。

slave1 [localhost:45009] ((none)) > create user clone_user@'localhost' identified by 'sekret';
Query OK, 0 rows affected (0.01 sec)

slave1 [localhost:45009] ((none)) > GRANT CLONE_ADMIN ON *.* TO 'clone_user'@'localhost';
Query OK, 0 rows affected (0.00 sec)

接下來,安裝並驗證外掛,並在主和從伺服器上建立使用者。

 

克隆過程

如上所述,克隆過程可以在本地或遠端執行。此外,它支援複製,這意味著克隆操作從捐贈者提取和傳輸複製座標並將其應用於收件人。它可用於 GTID 或非 GTID 複製。

因此,要開始克隆過程,首先,讓我們確保有一個有效的供體(Master)。這由 clone_valid_donor_list 引數控制。由於它是動態引數,您可以在伺服器執行時進行更改。使用 show variables 命令將顯示引數是否具有有效的供體(Master):

slave1 [localhost:45009] ((none)) > SHOW VARIABLES LIKE 'clone_valid_donor_list';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| clone_valid_donor_list | |
+------------------------+-------+
1 row in set (0.01 sec)

 

例子中,我們需要對它進行設定:

slave1 [localhost:45009] ((none)) > set global clone_valid_donor_list = '127.0.0.1:45008';
Query OK, 0 rows affected (0.00 sec)

 

下一步不是強制性的,但使用預設的 log_error_verbosity,錯誤日誌不會顯示有關克隆進度的大量資訊。所以,對於這個例子,我會將詳細程度調整到更高的級別(在供體和受體機上):

mysql > set global log_error_verbosity=3;
Query OK, 0 rows affected (0.00 sec)

 

現在,讓我們在受體(Slave)上開始克隆過程:

slave1 [localhost:45009] ((none)) > CLONE INSTANCE FROM [email protected]:45008 identified by 'sekret';
Query OK, 0 rows affected (38.58 sec)

 

可以在兩個伺服器的錯誤日誌中觀察克隆進度。以下是供體(Master)的輸出:

2019-07-31T12:48:48.558231Z 47 [Note] [MY-013273] [Clone] Plugin Clone reported: 'Server: Acquired backup lock.'
2019-07-31T12:48:48.558307Z 47 [Note] [MY-013457] [InnoDB] Clone Begin Master Task by clone_user@localhost
2019-07-31T12:48:48.876138Z 47 [Note] [MY-013273] [Clone] Plugin Clone reported: 'Server: COM_INIT: Storage Initialize.'
2019-07-31T12:48:48.876184Z 47 [Note] [MY-013273] [Clone] Plugin Clone reported: 'Server: COM_RES_COMPLETE.'
2019-07-31T12:48:53.996976Z 48 [Note] [MY-013458] [InnoDB] Clone set state change ACK: 1
2019-07-31T12:48:53.997046Z 48 [Note] [MY-013273] [Clone] Plugin Clone reported: 'Server: COM_ACK: Storage Ack.'
2019-07-31T12:48:53.997148Z 48 [Note] [MY-013273] [Clone] Plugin Clone reported: 'Server: COM_RES_COMPLETE.'
2019-07-31T12:48:54.096766Z 47 [Note] [MY-013458] [InnoDB] Clone Master received state change ACK
2019-07-31T12:48:54.096847Z 47 [Note] [MY-013458] [InnoDB] Clone State Change : Number of tasks = 1
2019-07-31T12:48:54.096873Z 47 [Note] [MY-013458] [InnoDB] Clone State BEGIN FILE COPY
...
2019-07-31T12:49:33.939968Z 47 [Note] [MY-013457] [InnoDB] Clone End Master Task ID: 0 Passed, code: 0:
2019-07-31T12:49:33.940016Z 47 [Note] [MY-013273] [Clone] Plugin Clone reported: 'Server: COM_EXIT: Storage End.'
2019-07-31T12:49:33.940115Z 47 [Note] [MY-013273] [Clone] Plugin Clone reported: 'Server: COM_RES_COMPLETE.'
2019-07-31T12:49:33.940150Z 47 [Note] [MY-013273] [Clone] Plugin Clone reported: 'Server: Exiting clone protocol.'

 

和受體(Slave):

2019-07-31T12:48:48.521515Z 8 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Task Connect.'
2019-07-31T12:48:48.557855Z 8 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Master ACK Connect.'
2019-07-31T12:48:48.557923Z 8 [Note] [MY-013457] [InnoDB] Clone Apply Begin Master Version Check
2019-07-31T12:48:48.558474Z 8 [Note] [MY-013457] [InnoDB] Clone Apply Version End Master Task ID: 0 Passed, code: 0:
2019-07-31T12:48:48.558507Z 8 [Note] [MY-013457] [InnoDB] Clone Apply Begin Master Task
2019-07-31T12:48:48.558749Z 8 [Warning] [MY-013460] [InnoDB] Clone removing all user data for provisioning: Started
2019-07-31T12:48:48.558769Z 8 [Note] [MY-011977] [InnoDB] Clone Drop all user data
2019-07-31T12:48:48.863134Z 8 [Note] [MY-011977] [InnoDB] Clone: Fix Object count: 371 task: 0
2019-07-31T12:48:53.829493Z 8 [Note] [MY-011977] [InnoDB] Clone Drop User schemas
2019-07-31T12:48:53.829948Z 8 [Note] [MY-011977] [InnoDB] Clone: Fix Object count: 5 task: 0
2019-07-31T12:48:53.838939Z 8 [Note] [MY-011977] [InnoDB] Clone Drop User tablespaces
2019-07-31T12:48:53.839800Z 8 [Note] [MY-011977] [InnoDB] Clone: Fix Object count: 6 task: 0
2019-07-31T12:48:53.910728Z 8 [Note] [MY-011977] [InnoDB] Clone Drop: finished successfully
...
2019-07-31T12:49:33.836509Z 8 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Command COM_EXECUTE.'
2019-07-31T12:49:33.836998Z 8 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Master ACK COM_EXIT.'
2019-07-31T12:49:33.839498Z 8 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Master ACK Disconnect : abort: false.'
2019-07-31T12:49:33.851403Z 0 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Command COM_EXECUTE.'
2019-07-31T12:49:33.851796Z 0 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Task COM_EXIT.'
2019-07-31T12:49:33.852398Z 0 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Task Disconnect : abort: false.'
2019-07-31T12:49:33.852472Z 0 [Note] [MY-013457] [InnoDB] Clone Apply End Task ID: 1 Passed, code:

請注意,克隆過程完成後,將重新啟動受體(Slave)上的 MySQL 服務。在此之後,資料庫已準備好被訪問,最後一步是設定副本。

 

複製過程

二進位制日誌位置(檔名,偏移量)和 GTID 座標都從供體(Master) MySQL 伺服器例項中提取和傳輸。

可以在克隆的 MySQL 伺服器例項上執行以下查詢,以檢視二進位制日誌位置或應用的最後一個事務的 GTID:

# Binary log position
slave1 [localhost:45009] ((none)) > SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
+------------------+-----------------+
| BINLOG_FILE | BINLOG_POSITION |
+------------------+-----------------+
| mysql-bin.000001 | 437242601 |
+------------------+-----------------+
1 row in set (0.01 sec)

# GTID
slave1 [localhost:45009] ((none)) > SELECT @@GLOBAL.GTID_EXECUTED;
+----------------------------------------------+
| @@GLOBAL.GTID_EXECUTED |
+----------------------------------------------+
| 00045008-1111-1111-1111-111111111111:1-32968 |
+----------------------------------------------+
1 row in set (0.00 sec)

有了這些資訊,我們需要相應地執行 CHANGE MASTER 命令:

slave1 [localhost:45009] ((none)) > CHANGE MASTER TO
MASTER_HOST = '127.0.0.1',
MASTER_PORT = 45008,
MASTER_USER='root',
MASTER_PASSWORD='msandbox',
MASTER_AUTO_POSITION = 1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

slave1 [localhost:45009] ((none)) > start slave;
Query OK, 0 rows affected (0.00 sec)

限制

克隆外掛有一些限制,這裡將對它們進行描述。在我看來,社群將面臨兩個主要限制。

首先,它只能克隆 InnoDB 引擎的表。這意味著 MyISAM 和 CSV 引擎儲存的任何表,都將被克隆為空表。

另一個限制是關於 DDL,包括 TRUNCATE TABLE,這在克隆操作期間是不允許的。但是,允許併發 DML。如果 DDL 正在執行,則克隆操作將等待鎖定:

+----+------------+-----------------+------+----------+-------+----------------------------+------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------------+-----------------+------+----------+-------+----------------------------+------+
| 63 | clone_user | localhost:34402 | NULL | clone | 3 | Waiting for backup lock | NULL |
+----+------------+-----------------+------+----------+-------+----------------------------+------+

否則,如果克隆操作正在執行,則 DDL 將等待鎖定:

+----+-----------------+-----------------+------+------------------+-------+---------------------------------------------------------------+----------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------------+------+------------------+-------+---------------------------------------------------------------+----------------------------------+
| 52 | msandbox | localhost | test | Query | 5 | Waiting for backup lock | alter table joinit engine=innodb |
| 60 | clone_user | localhost:34280 | NULL | clone | 15 | Receiving from client | NULL |
| 61 | clone_user | localhost:34282 | NULL | clone | 15 | Receiving from client | NULL |
| 62 | clone_user | localhost:34284 | NULL | clone | 6 | Receiving from client | NULL |
+----+-----------------+-----------------+------+------------------+-------+---------------------------------------------------------------+----------------------------------+

 

結論

藉助 MySQL 8.0.17 clone 外掛,建立副本變得更加容易。此功能也可以使用 SSL 連線和加密資料使用。在釋出此部落格文章時,克隆外掛不僅可用於設定非同步副本,還可用於設