diff --git a/mysql.md b/mysql.md
index 56548f1..6b1f205 100644
--- a/mysql.md
+++ b/mysql.md
@@ -14,15 +14,20 @@
- [Репликация - общие настройки](#репликация---общие-настройки)
- [Пользователь для выполнения задач репликации](#пользователь-для-выполнения-задач-репликации)
- [Настройка мастера для репликации](#настройка-мастера-для-репликации)
- - [Настройка слейва для репликации](#настройка-слейва-для-репликации)
- [Репликация средствами mysqldump](#репликация-средствами-mysqldump)
- [Дамп БД средствами mysqldump](#дамп-бд-средствами-mysqldump)
- [Настройка репликации mysqldump](#настройка-репликации-mysqldump)
+ - [Настройка слейва для репликации](#настройка-слейва-для-репликации)
- [Запуск воспроизведения журнала ретрансляции, и проверка статуса репликации mysqldump](#запуск-воспроизведения-журнала-ретрансляции-и-проверка-статуса-репликации-mysqldump)
- [Проверка репликации mysqldump](#проверка-репликации-mysqldump)
- [Репликация - Percona XtraBackup](#репликация---percona-xtrabackup)
- [Установка Percona XtraBackup](#установка-percona-xtrabackup)
- [Настройка репликации xtrabackup](#настройка-репликации-xtrabackup)
+ - [Подготовка резервной копии перед восстановлением](#подготовка-резервной-копии-перед-восстановлением)
+ - [Копирование резервной копии на слейв](#копирование-резервной-копии-на-слейв)
+ - [Восстановление БД на слейве](#восстановление-бд-на-слейве)
+ - [Настройка репликации](#настройка-репликации)
+ - [Проверка репликации xtrabackup](#проверка-репликации-xtrabackup)
## Установка сервера MySQL 8 в Debian 12
@@ -208,7 +213,35 @@ SHOW BINARY LOG STATUS;
-
-
-### Настройка слейва для репликации
+## Репликация средствами mysqldump
+
+### Дамп БД средствами mysqldump
+
+Для того, чтобы начать репликацию данных, необходимо “подтянуть” слейв до состояния мастера. Для этого, нужно временно заблокировать сам мастер, чтобы сделать слепок актуальных данных.
+
+```shell
+FLUSH TABLES WITH READ LOCK;
+```
+
+Далее, с помощью mysqldump сделать экспорт данных из базы.
+
+```shell
+mysqldump -u root -p sape_test_db > sape_test_db.db
+```
+
+После этого, необходимо еще раз выполнить команду `SHOW BINARY LOG STATUS;`, и запомнить или записать значения File и Position. Это, так называемые координаты двоичного журнала. Именно от них далее будет указано стартовать слейву.
+
+Теперь мастер можно разблокировать.
+
+```shell
+UNLOCK TABLES;
+```
+
+Мастер настроен, и готов реплицироваться на другие сервера.
+
+### Настройка репликации mysqldump
+
+#### Настройка слейва для репликации
В первую очередь на слейв необходимо загрузить дамп, полученный с мастера
@@ -242,34 +275,6 @@ read_only = 1 # переводим слейв в режим “только ч
systemctl restart mysql.service
```
-## Репликация средствами mysqldump
-
-### Дамп БД средствами mysqldump
-
-Для того, чтобы начать репликацию данных, необходимо “подтянуть” слейв до состояния мастера. Для этого, нужно временно заблокировать сам мастер, чтобы сделать слепок актуальных данных.
-
-```shell
-FLUSH TABLES WITH READ LOCK;
-```
-
-Далее, с помощью mysqldump сделать экспорт данных из базы.
-
-```shell
-mysqldump -u root -p sape_test_db > sape_test_db.db
-```
-
-После этого, необходимо еще раз выполнить команду `SHOW BINARY LOG STATUS;`, и запомнить или записать значения File и Position. Это, так называемые координаты двоичного журнала. Именно от них далее будет указано стартовать слейву.
-
-Теперь мастер можно разблокировать.
-
-```shell
-UNLOCK TABLES;
-```
-
-Мастер настроен, и готов реплицироваться на другие сервера.
-
-### Настройка репликации mysqldump
-
Необходимо указать слейву, какой сервер будет являться для него мастером, и откуда начинать реплицировать данные. Вместо `MASTER_LOG_FILE` и `MASTER_LOG_POS` необходимо подставить значения, полученные из `SHOW BINARY LOG STATUS;` на мастере. Эти параметры вместе называются координатами двоичного журнала.
Адрес мастера указан в `hosts`, поэтому достаточно указать его имя
@@ -277,7 +282,13 @@ UNLOCK TABLES;
Начиная с MySQL 8.4+: `GET_SOURCE_PUBLIC_KEY` является обязательным параметром, который необходимо добавить -
```shell
-CHANGE REPLICATION SOURCE TO SOURCE_HOST='master', SOURCE_USER='repl_user', SOURCE_PASSWORD='repl_passwd', SOURCE_LOG_FILE='mysql-bin.000002', SOURCE_LOG_POS=158, GET_SOURCE_PUBLIC_KEY=1;
+CHANGE REPLICATION SOURCE TO
+ SOURCE_HOST='master',
+ SOURCE_USER='repl_user',
+ SOURCE_PASSWORD='repl_passwd',
+ SOURCE_LOG_FILE='mysql-bin.000002',
+ SOURCE_LOG_POS=158,
+ GET_SOURCE_PUBLIC_KEY=1;
```
В более ранних версиях используется команда - `CHANGE MASTER TO...`
@@ -481,10 +492,14 @@ xtrabackup version 8.4.0-2 based on MySQL server 8.4.0 Linux (x86_64) (revision
### Настройка репликации xtrabackup
+
+
```shell
-xtrabackup --backup --user=repl_user --password=repl_passwd --slave-info --use-memory=1GB --parallel=2 --compress --compress-threads=2 --compress --stream=xbstream --target-dir=/tmp
+xtrabackup --backup --user=root --password --target-dir=/tmp/dump
```
+параметров достаточно много, вот некоторые из них:
+
`--backup` - создание резервной копии;
`--compress` - сжатие резервной копии;
`--stream=xbstream` - собрать файлы резервной копии в единый архив;
@@ -493,37 +508,166 @@ xtrabackup --backup --user=repl_user --password=repl_passwd --slave-info --use-m
также могут использоваться дополнительные параметры, например
-`--slave-info` - ?
+`--slave-info` - указывает, что нужно сохранить информацию о репликации (например, позицию бинарного лога) в резервной копии. Это полезно, если планируется использовать резервную копию для настройки реплики;
`--use-memory` - ограничения на использование памяти;
`--parallel` - использование нескольких ядер процессора для ускорения процесса создания резервной копии;
`--compress-threads` - сжатие в несколько потоков.
+### Подготовка резервной копии перед восстановлением
+```shell
+xtrabackup --prepare --target-dir=/tmp/dump
+```
-https://docs.percona.com/percona-xtrabackup/8.4/set-up-replication.html
-https://itproblog.ru/%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-mysql-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0-%D1%87%D0%B0%D1%81%D1%82%D1%8C-7-%D1%80%D0%B5%D0%B7%D0%B5%D1%80%D0%B2%D0%BD%D0%BE/#Percona_XtraBackup
-https://serveradmin.ru/polnyj-i-inkrementnyj-backup-mysql/
-https://www.slingacademy.com/article/mysql-8-how-to-create-a-replica-using-percona-xtrabackup/
-https://stupin.su/wiki/mysql_slave_xtrabackup/
+### Копирование резервной копии на слейв
+```shell
+rsync -avpP -e ssh /tmp/dump slave:/tmp
+```
-https://jira.sapient.ru/browse/SA-3031
-https://wiki.sapient.ru/pages/viewpage.action?pageId=51511379
-https://jira.sapient.ru/browse/DEVOPS-1771
+### Восстановление БД на слейве
+Остановить сервер БД и переместить имеющиеся данные на слейве
-***
+```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/my.cnf (из других конфиг.файлов конфигурация не применялась) в секции [mysqld]
+
+```shell
+[mysqld]
+server_id = 2
+```
+
+Запустить сервер БД
+
+```shell
+systemctl start mysql
+```
+
+Убедиться в том, что нужные параметры применились можно запросом в БД
+
+```shell
+mysql> SHOW VARIABLES LIKE 'server_id';
++---------------+-------+
+| Variable_name | Value |
++---------------+-------+
+| server_id | 2 |
++---------------+-------+
+1 row in set (0,00 sec)
+```
+
+Уточнить значение и позицию `bin-log` в каталоге, в который скопировали резервную копию с мастера, в данном примере - `/tmp/dump`
+
+```shell
+root@slave:~# cat /tmp/dump/xtrabackup_binlog_info
+mysql-bin.000002 158
+```
+
+Команда для запуска репликации в консоли mysql
+
+```shell
+mysql -u root -p
+```
+
+```shell
+CHANGE REPLICATION SOURCE TO
+ SOURCE_HOST='master',
+ SOURCE_USER='repl_user',
+ SOURCE_PASSWORD='repl_passwd',
+ SOURCE_LOG_FILE='mysql-bin.000002',
+ SOURCE_LOG_POS=158,
+ GET_SOURCE_PUBLIC_KEY=1;
+```
+
+```shell
+START REPLICA;
+```
+
+```shell
+SHOW REPLICA STATUS\G
+```
+
+на что обратить внимание в выводе:
+
+```shell
+mysql> SHOW REPLICA STATUS\G
+*************************** 1. row ***************************
+ Replica_IO_State: Waiting for source to send event
+ Source_Host: master
+ Source_User: repl_user
+...
+ Replica_IO_Running: Yes
+ Replica_SQL_Running: Yes
+...
+ Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
+...
+```
+
+### Проверка репликации xtrabackup
+
+На мастере добавить данные и убедиться, что они появились на слейве
+
+```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> 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)
+```
+
+[вверх](#mysql)
diff --git a/mysql_5.7_xtrabackup.md b/mysql_5.7_xtrabackup.md
new file mode 100644
index 0000000..880c81e
--- /dev/null
+++ b/mysql_5.7_xtrabackup.md
@@ -0,0 +1,389 @@
+# 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)
+```