# MySQL 5.7 на Debian 12 Описан процесс установки MySQL 5.7 и настройка репликации с помощью Percona xtrabackup мастер -> слейв - [MySQL 5.7 на Debian 12](#mysql-57-на-debian-12) - [Установка MySQL 5.7 на Debian 12](#установка-mysql-57-на-debian-12) - [xtrabackup на mysql 5.7](#xtrabackup-на-mysql-57) - [Установка Percona xtrabackup](#установка-percona-xtrabackup) - [Создание тестовой БД и наполнение данными](#создание-тестовой-бд-и-наполнение-данными) - [Подключение к СУБД](#подключение-к-субд) - [Создание базы данных](#создание-базы-данных) - [Переключение на созданную базу данных](#переключение-на-созданную-базу-данных) - [Создание таблицы в базе данных](#создание-таблицы-в-базе-данных) - [Добавление записей в таблицу](#добавление-записей-в-таблицу) - [Выборка из таблицы](#выборка-из-таблицы) - [Репликация - общие настройки](#репликация---общие-настройки) - [Пользователь для выполнения задач репликации](#пользователь-для-выполнения-задач-репликации) - [Настройка мастера для репликации](#настройка-мастера-для-репликации) - [Настройка репликации xtrabackup](#настройка-репликации-xtrabackup) - [Создание резервной копии](#создание-резервной-копии) - [Подготовка резервной копии перед восстановлением](#подготовка-резервной-копии-перед-восстановлением) - [Копирование резервной копии на слейв](#копирование-резервной-копии-на-слейв) - [Восстановление БД на слейве](#восстановление-бд-на-слейве) - [Настройка репликации](#настройка-репликации) - [Старт репликации](#старт-репликации) - [Проверка репликации](#проверка-репликации) *** ## Установка MySQL 5.7 на Debian 12 Выбираем версию 5.7.42 для Debian ```shell wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.42-1debian10_amd64.deb-bundle.tar tar -xvf mysql-server_5.7.42-1debian10_amd64.deb-bundle.tar apt install ./mysql-community-client_5.7.42-1debian10_amd64.deb apt install ./mysql-client_5.7.42-1debian10_amd64.deb apt install ./mysql-community-server_5.7.42-1debian10_amd64.deb ``` ## xtrabackup на mysql 5.7 ### Установка Percona xtrabackup ```shell apt update && apt install curl curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb apt install gnupg2 lsb-release ./percona-release_latest.generic_all.deb apt update percona-release enable pxb-24 apt update apt install percona-xtrabackup-24 ``` ```shell xtrabackup --version ``` ## Создание тестовой БД и наполнение данными ### Подключение к СУБД ```shell mysql -u root -p ``` ### Создание базы данных ```shell CREATE DATABASE IF NOT EXISTS sape_test_db; ``` По ошибке была создана БД с именем - `sape_test_db.db` При её удалении полачал ошибку ```shell mysql> drop database 'sape_test_db.db'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''sape_test_db.db'' at line 1 ``` Поиск причин привёл - при использовании в названии зарезервированных слов, следует заключать имя БД в косые ковычки ` ```shell mysql> drop database `sape_test_db.db`; Query OK, 0 rows affected (0,17 sec) ``` ### Переключение на созданную базу данных ```shell USE sape_test_db; ``` ### Создание таблицы в базе данных таблица будет содержать три столбца: id, name, surname, address. Первичным ключом будет id. В качестве движка явно укажем InnoDB. ```shell CREATE TABLE admin_table ( id int NOT NULL AUTO_INCREMENT, name char(20) NOT NULL, surname char(20) NOT NULL, city char(20) NULL, PRIMARY KEY (id) ) ENGINE=InnoDB; ``` для удаления таблицы ```shell DROP TABLE admin_table; ``` ### Добавление записей в таблицу ```shell INSERT admin_table(name, surname, city) VALUES ('Andrei', 'Ahmadulin', 'Ekaterinburg'); INSERT admin_table(name, surname, city) VALUES ('Ilya', 'Paramonov', 'Moscow'); INSERT admin_table(name, surname, city) VALUES ('Andrei', 'Zharkov', 'Moscow'); INSERT admin_table(name, surname, city) VALUES ('Artem', 'Dolgiy', 'Zelenograd'); ``` ### Выборка из таблицы ```shell SELECT * FROM admin_table; ``` ## Репликация - общие настройки Эти настройки выполняются вне зависимости от выбранного способа репликации ### Пользователь для выполнения задач репликации Будет создан пользователь `repl_user` с паролем `repl_passwd` ```shell mysql -u root -p ``` ```shell CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_passwd'; ``` Если возникнет ошибка - `ERROR 1819 (HY000): Your password does not satisfy the current policy requirements` - кратко - достаточно изменить политику паролей ```shell mysql> SHOW VARIABLES LIKE 'validate_password%'; +-------------------------------------------------+--------+ | Variable_name | Value | +-------------------------------------------------+--------+ | validate_password.changed_characters_percentage | 0 | | validate_password.check_user_name | ON | | validate_password.dictionary_file | | | validate_password.length | 8 | | validate_password.mixed_case_count | 1 | | validate_password.number_count | 1 | | validate_password.policy | MEDIUM | | validate_password.special_char_count | 1 | +-------------------------------------------------+--------+ 8 rows in set (0,03 sec) mysql> SET GLOBAL validate_password.policy = LOW; Query OK, 0 rows affected (0,00 sec) mysql> ``` Теперь пользователя можно будет создать с простым паролем - `'repl_passwd'` Назначение привилегий для пользователя ```shell GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; ``` ### Настройка мастера для репликации В файл `/etc/mysql/conf.d/mysqld.cnf`, в секции `[mysqld]` необходимо добавить следующие параметры: ```shell [mysqld] server_id = 1 log_bin = mysql-bin ``` После изменения конфигурации необходимо перезагрузить СУБД ```shell systemctl restart mysql.service ``` Убедиться в том, что нужные параметры применились можно запросом в БД ```shell mysql> SHOW VARIABLES LIKE 'server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 1 | +---------------+-------+ 1 row in set (0,00 sec) ``` ```shell mysql> SHOW VARIABLES LIKE 'log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+ 1 row in set (0,00 sec) ``` ## Настройка репликации xtrabackup ### Создание резервной копии ```shell xtrabackup --backup --user=root --password --target-dir=/tmp/dump ``` ## Подготовка резервной копии перед восстановлением ```shell xtrabackup --prepare --target-dir=/tmp/dump ``` ## Копирование резервной копии на слейв ```shell rsync -avpP -e ssh /tmp/dump slave:/tmp ``` ## Восстановление БД на слейве Остановить сервер БД и переместить имеющиеся данные на слейве ```shell systemctl stop mysql mkdir /root/mysql_old && mv /var/lib/mysql/* /root/mysql_old ``` Позднее, если не будет ошибок, перемещённые данные можно будет удалить ```shell rm -rf /root/mysql_old ``` копирование дампа в целевой каталог слейва ```shell xtrabackup --move-back --target-dir=/tmp/dump --datadir=/var/lib/mysql ``` установить корректные права ```shell chown -R mysql:mysql /var/lib/mysql ``` ## Настройка репликации Изменить конфигурацию слейва `/etc/mysql/conf.d/mysqld.cnf`, в секции `[mysqld]` ```shell [mysqld] server_id = 2 ``` Запустить сервер БД ```shell systemctl start mysql ``` Убедиться в том, что нужные параметры применились можно запросом в БД ```shell mysql> SHOW VARIABLES LIKE 'server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 1 | +---------------+-------+ 1 row in set (0,00 sec) ``` ### Старт репликации В скопированном дампе БД с мастера - `/tmp/dump` уточнить название бинарного лога и позицию ```shell root@slave:~# cat /tmp/dump/xtrabackup_binlog_info mysql-bin.000001 154 ``` Команда для запуска репликации в консоли mysql ```shell mysql -u root -p ``` ```sql CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='repl_user', MASTER_PASSWORD='repl_passwd', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; ``` ```shell START SLAVE; ``` ```shell SHOW SLAVE STATUS \G ``` Стоит обратить внимание не значения ```shell Slave_IO_Running: Yes Slave_SQL_Running: Yes ``` ## Проверка репликации На мастере добавить данные и убедиться, что они появились на слейве ```shell mysql -u root -p use sape_test_db; INSERT admin_table(name, surname, city) VALUES ('Nikita', 'Samoilov', 'Sankt-Petersburg'); ``` ```shell mysql> select * from admin_table; +----+--------+-----------+------------------+ | id | name | surname | city | +----+--------+-----------+------------------+ | 1 | Andrei | Ahmadulin | Ekaterinburg | | 2 | Kit | Root | Georgia | | 3 | Ilya | Paramonov | Moscow | | 4 | Andrei | Zharkov | Moscow | | 5 | Artem | Dolgiy | Zelenograd | | 6 | Nikita | Samoilov | Sankt-Petersburg | +----+--------+-----------+------------------+ 6 rows in set (0,00 sec) ``` Проверить данные на слейве ```shell mysql -u root -p use sape_test_db; ``` ```shell mysql> select * from admin_table; +----+--------+-----------+------------------+ | id | name | surname | city | +----+--------+-----------+------------------+ | 1 | Andrei | Ahmadulin | Ekaterinburg | | 2 | Ilya | Paramonov | Moscow | | 3 | Andrei | Zharkov | Moscow | | 4 | Artem | Dolgiy | Zelenograd | | 5 | Nikita | Samoilov | Sankt-Petersburg | +----+--------+-----------+------------------+ 5 rows in set (0,00 sec) ```