[4] MySQL – Klonowanie

27 stycznia 2022 Wyłączono przez Adam [zicherka] Nogły

Użyjemy klonowanie, które zostało wprowadzone od wersji MySQL 8.0.17.

[1] Usługa klonowanie, nie jest domyślnie włączona – dlatego włącz ją na wszystkich hostach, na których ma być usługa klonowania.

#sprawdźmy wersję MySQL
[root@vlsr01 ~]# /usr/libexec/mysqld --version
/usr/libexec/mysqld  Ver 8.0.26 for Linux on x86_64 (Source distribution)

[root@vlsr01 ~]# mcedit /etc/my.cnf.d/mysql-server.cnf
#dodaj do sekcji [mysqld]
[mysqld]
plugin-load=mysql_clone.so

[root@vlsr01 ~]# systemctl restart mysqld

#pokaż załadowane pluginy
[root@vlsr01 ~]# mysql -u root -p -e "select plugin_name, plugin_status, plugin_type from information_schema.plugins where plugin_name = 'clone';"
Enter password: #wpisz haslo
+-------------+---------------+-------------+
| plugin_name | plugin_status | plugin_type |
+-------------+---------------+-------------+
| clone       | ACTIVE        | CLONE       |
+-------------+---------------+-------------+

[2] Przygotuj katalogi na lokalnym hoście.

#utwórz katalog na sklonowane dane
[root@vlsr01 ~]# mkdir /home/mysql_backup
[root@vlsr01 ~]# chown mysql. /home/mysql_backup

[3] Jeśli SELinux jest uruchomiony potrzebna jest zmiana polityki dla katalogu docelowego. Jeśli robisz klonowanie w katalogu [/home] wykonaj poniższe czynności.

[root@vlsr01 ~]# mcedit mysqld-clone.te
#stwórz nowy
module mysqld-clone 1.0;
require {
        type mysqld_t;
        type user_home_dir_t;
        class dir { add_name create remove_name write };
        class file { create getattr open read unlink write };
}
#============= mysqld_t ==============
allow mysqld_t user_home_dir_t:dir { add_name create remove_name write };
allow mysqld_t user_home_dir_t:file { create getattr open read unlink write };

[root@vlsr01 ~]# checkmodule -m -M -o mysqld-clone.mod mysqld-clone.te
[root@vlsr01 ~]# semodule_package --outfile mysqld-clone.pp --module mysqld-clone.mod
[root@vlsr01 ~]# semodule -i mysqld-clone.pp

[4] Uruchom klonowanie

#jeśli wpiszesz katalog już istniejący, system zgłosi błąd
#dlatego też wpisz nowy katalog w sekcji [directory = ]
[root@vlsr01 ~]# mysql -u root -p -e "clone local data directory = '/home/mysql_backup/backup01/';"
Enter password:

[root@vlsr01 ~]# ll /home/mysql_backup/backup01/
razem 180228
drwxr-x---. 2 mysql mysql       89 01-27 15:42 '#clone'
-rw-r-----. 1 mysql mysql     3877 01-27 15:41  ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 01-27 15:41  ibdata1
-rw-r-----. 1 mysql mysql 50331648 01-27 15:42  ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 01-27 15:42  ib_logfile1
drwxr-x---. 2 mysql mysql        6 01-27 15:41  mysql
-rw-r-----. 1 mysql mysql 25165824 01-27 15:41  mysql.ibd
drwxr-x---. 2 mysql mysql       28 01-27 15:41  sys
-rw-r-----. 1 mysql mysql 16777216 01-27 15:41  undo_001
-rw-r-----. 1 mysql mysql 16777216 01-27 15:41  undo_002

[5] Aby użyć [CLONE INSTANCE FROM], możliwe jest pobranie klonu bezpośrednio ze zdalnego hosta. W oficjalnych dokumentach źródło klonu nazywa się [Donor], a cel klonu nazywa się [Recipient].

#na hoście [Donor (vlsr01.zicher.lab)] stwórz użytkownika i dodaj uprawnienia [BACKUP_ADMIN] dla wykonania kopii zapasowych
[root@vlsr01 ~]# mysql -u root -p
Enter password: #wpisz hasło
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create user 'clone_user'@'%' identified by 'TajneHasło';
Query OK, 0 rows affected (0,00 sec)
mysql> grant BACKUP_ADMIN on *.* to 'clone_user'@'%';
Query OK, 0 rows affected (0,00 sec)

#na hoście odbiorcy [Recipient (vlsr02.zicher.lab)] stwórz użytkownika i dodaj prawa do klonowania [CLONE_ADMIN]
[root@vlsr02 ~]# mysql -u root -p
Enter password: #wpisz hasło
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create user 'clone_user'@'%' identified by 'TajneHasło';
Query OK, 0 rows affected (0,01 sec)
mysql> grant CLONE_ADMIN on *.* to 'clone_user'@'%';
Query OK, 0 rows affected (0,00 sec)

# na hoście odbiorcy, uruchom zadanie klonowania
# przed klonowaniem ustaw [set global clone_valid_donor_list = (adres IP dawcy:port)]
# dane klonu są kopiowane do [/var/lib/mysql]
[root@vlsr02 ~]# mysql -u root -p
Enter password: #wpisz hasło
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> set global clone_valid_donor_list = '192.168.100.101:3306';
Query OK, 0 rows affected (0,00 sec)
mysql> clone instance from clone_user@192.168.100.101:3306 identified by 'TajneHasło';
Query OK, 0 rows affected (1,56 sec)
#potwierdź status klonowania
#wszystko w porządku gdy [STATE] jest [Completed]
mysql> select STATE from performance_schema.clone_status;
+-----------+
| STATE     |
+-----------+
| Completed |
+-----------+
1 row in set (0,00 sec)
mysql> exit
Bye

# jeśli określisz sklonowany katalog docelowy, dodaj [data directory = '*']
# ale potem musisz ustawić odpowiednie uprawnienia do katalogu docelowego jak w [2], [3]
mysql> clone instance from clone_user@192.168.100.101:3306 identified by 'TajneHasło' data directory = '/home/mysql_backup/backup01/';