This commit is contained in:
2025-02-25 10:44:31 +03:00
parent af41705fb7
commit 9b4fb459c3
2 changed files with 585 additions and 52 deletions

248
mysql.md
View File

@@ -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;
- <https://habr.com/ru/articles/532216/>
- <https://www.k-max.name/linux/replikaciya-mysql-master-slave/>
### Настройка слейва для репликации
## Репликация средствами 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` является обязательным параметром, который необходимо добавить - <https://stackoverflow.com/questions/69936021/error-002061-authentication-plugin-caching-sha2-password-reported-error-aut>
```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
<https://docs.percona.com/percona-xtrabackup/8.4/set-up-replication.html>
```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
```
- <https://habr.com/ru/companies/oleg-bunin/articles/309326/>
- <https://habr.com/ru/articles/56702/>
- <https://habr.com/ru/companies/otus/articles/600153/>
- <https://habr.com/ru/companies/selectel/articles/708434/>
Позднее, если не будет ошибок, перемещённые данные можно будет удалить
ещё
```shell
rm -rf /root/mysql_old
```
- <https://habr.com/ru/articles/532216/>
- <https://timeweb.cloud/tutorials/mysql/kak-nastroit-replikatsiyu-v-mysql>
- <https://www.k-max.name/linux/replikaciya-mysql-master-slave/>
- <https://stackoverflow.com/questions/69936021/error-002061-authentication-plugin-caching-sha2-password-reported-error-aut>
копирование дампа в целевой каталог слейва
```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)