notes/mysql_5.7_xtrabackup.md

390 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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