Klonen leicht gemacht: Das MySQL Plugin mysql_clone.so

stormtrooper-1343772_1920
Das Duplizieren von Datenbanken ist eine gängige Admin-Tätigkeit, um:
  • Entwicklungsumgebungen aufzubauen
  • Replikationen aufzubauen
  • Cluster aufzubauen
  • ….
Diese Arbeit kann mit der MySQL-Version 8.0.17 und dem neuen CLONE-SQL-Kommando nun deutlich vereinfacht werden.

Daten empfangen Du wirst…

Generell sind an einem Klonprozess zwei Systeme beteiligt. Diese werden bei MySQL wie folgt bezeichnet:

  • Donor (Das Quellsystem)
  • Recipient (Das Zielsystem)

Der Prozess des Klonens wird auf dem Empfänger gestartet, muss aber natürlich vorbereitet werden. Dazu benötigt dieses System einen Account, mit dem er die Daten vom Spender anfordern kann. Dieser Account benötigt dazu die „BACKUP_ADMIN"-Rolle.
mysql> create user ’clone‘@’%’ identified by ’clone‘;
mysql> grant backup_admin on *.* to ’clone‘@’%’ 

Zusätzlich zum Account muss auf den beteiligten Systemen das Plugin „mysql_clone.so" geladen werden. Außerdem muss der Spender auf dem Empfänger als gültige Quelle deklariert werden:

mysql> set global clone_valid_donor_list='192.168.56.101:3306'; 

Der Übertragungsprozess kann dann lokal (also auf derselben Maschine), remote (wie im Beispiel), verschlüsselt und/oder komprimiert durchgeführt werden.

Überwachen den Prozess Du musst…

Nachdem der Klonprozess gestartet wurde (siehe unten), kann dieser auf dem Empfänger überwacht werden.

mysql> clone instance from 'root'@'192.168.56.101':3306 identified by 'root';
mysql> select id, stage, begin_time, end_time from performance_schema.clone_progress;
+----+-----------+----------------------------+----------------------------+
| id | stage     | begin_time                 | end_time                   |
+----+-----------+----------------------------+----------------------------+
|  1 | DROP DATA | 2020-01-28 15:32:31.034604 | 2020-01-28 15:32:35.594683 |
|  1 | FILE COPY | 2020-01-28 15:32:35.595617 | 2020-01-28 15:32:37.495037 |
|  1 | PAGE COPY | 2020-01-28 15:32:37.495356 | 2020-01-28 15:32:37.727107 |
|  1 | REDO COPY | 2020-01-28 15:32:37.727544 | 2020-01-28 15:32:37.829889 |
|  1 | FILE SYNC | 2020-01-28 15:32:37.830163 | 2020-01-28 15:32:38.987839 |
|  1 | RESTART   | 2020-01-28 15:32:38.987839 | 2020-01-28 15:32:44.437973 |
|  1 | RECOVERY  | 2020-01-28 15:32:44.437973 | 2020-01-28 15:32:45.769449 |
+----+-----------+----------------------------+----------------------------+

7 rows in set (0.0062 sec) 

Zu beachten ist, dass während des Vorgangs DDL-Kommandos auf dem Spender (!) blockiert werden. Zusätzlich besteht die Einschränkung, dass nur InnoDB-Tabellen mit Daten kopiert werden. Tabellen anderer Engines werden lediglich als Struktur (also ohne Daten) übertragen.

Glaube nur, was selbst gesehen Du hast...

Im folgenden Video klonen wir eine MySQL-Instanz innerhalb eines Servers. Der Spender (Donor) läuft auf Port 3306 und der Empfänger (Receiver) auf Port 3307. Nach der Konfiguration (Plugin laden, User anlegen, Spender deklarieren) wird die Instanz geklont.

Im Anschluss schauen wir uns kurz im "performance_schema" die verschiedenen Prozess-Abschnitte in der "clone_progress"-Tabelle an. Zur Kommunikation nutzen wir die MySQL Shell. Nach dem Übertragen startet der Empfänger automatisch durch. Aus diesem Grund verlieren wir hier kurzzeitig die Verbindung und müssen diese wieder aufbauen.

Wahrlich wunderbar das Plugin ist…

Viel einfacher lässt sich ein MySQL-Server wohl nicht kopieren. Nach kurzer Vorbereitungszeit (Konfiguration) lässt sich der Klonprozess problemlos auf dem Empfänger steuern und kontrollieren. Ein weiteres sehr nützliches Feature von MySQL 8.0.

Sie betreiben MySQL-Datenbanken im größeren Stil und wollen Ihre Prozesse und Abläufe effizienter gestalten oder gar automatisieren? Sprechen Sie mit uns.