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