# 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

<https://downloads.mysql.com/archives/community/>

Выбираем версию 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

<https://docs.percona.com/percona-xtrabackup/8.4/apt-repo.html>

```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
```

Поиск причин привёл - <https://stackoverflow.com/questions/16135987/error-on-drop-default-database-error>

при использовании в названии зарезервированных слов, следует заключать имя БД в косые ковычки `

```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` - <https://stackoverflow.com/questions/43094726/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

<https://docs.percona.com/percona-xtrabackup/2.4/howtos/setting_up_replication.html>

### Создание резервной копии

```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)
```
