Как восстановить репликацию MySQL или MariaDB

Автор George, Сен. 13, 2022, 03:19

« назад - далее »

George

Если кластер работает в режиме Master - Master, сначала найдем ноду, на которой произошел сбой репликации. Для этого заходим на каждом сервере в оболочку mysql следующей командой:

#
Код: bash
 mysql -uroot -p

* в данном примере заходим от имени пользователя root.

И выводим состояние ноды в режиме Slave:

mysql>
Код: bash
SHOW SLAVE STATUS\G

В случае проблем с репликацией мы увидим значения Slave_IO_Running и/или Slave_SQL_Running в состоянии No, а также описание ошибки:

Состояние нерабочей репликации MySQL

На рабочей Master-ноде
Блокируем все таблицы всех баз для чтения и записи:

mysql>
Код: bash
FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON;

И выводим состояние работы СУРБД:

mysql>
Код: bash
show master status\G

Результат будет, примерно, таким:

            File: mysql-bin.000015
        Position: 6315
    Binlog_Do_DB:
Binlog_Ignore_DB: information_schema,mysql

Запомним или запишем значения для File и Position. Они понадобятся при восстановлении вторичной ноды кластера.

Теперь выходим из командной оболочки базы:

mysql> \q

и создаем дамп рабочих баз:

#
Код: bash
mysqldump -uroot -p -v --databases db1 db2 > /tmp/mydb_dump.sql

* данная команда сделает дамп баз db1, db2 и сохранит его в файл /tmp/mydb_dump.sql.

Теперь снова подключаемся к MySQL:

#
Код: bash
mysql -uroot -p

и снимаем ранее установленные блокировки:

mysql>
Код: bash
SET GLOBAL read_only = OFF;

Отключаемся:

mysql> \q

Полученный ранее файл с резервной копией переносим на второй сервер при помощи такой команды:

#
Код: bash
scp /tmp/mydb_dump.sql dmosk@192.168.166.156:/tmp

* в данном примере, мы скопируем созданный нами дамп /tmp/mydb_dump.sql в каталог /tmp сервера 192.168.166.156 подключившись под учетной записью dmosk.
под рутом без граблей не работает такой перенос. Правим файлик ставим yes root логину


На нерабочей ноде
Создаем дамп баз:

#
Код: bash
mysqldump -uroot -p -v --databases db1 db2 > /tmp/mydb_dump_slave.sql

Код дампа всех баз (включая управляющую, для репликации ispconfig использую)

Код: bash
mysqldump -p --all-databases --allow-keywords --master-data --events --single-transaction > /root/mysqldump.sql

Заходим в оболочку управления MySQL:

#
Код: bash
mysql -uroot -p

Останавливаем репликацию:

mysql>
Код: bash
stop slave;

Удаляем старые базы:

mysql>
Код: bash
drop database db1;

mysql>
Код: bash
drop database db2;

* в данном примере удаляются базы, для которых мы сделали резервные копии.

И создаем их заново:

mysql>
Код: bash
CREATE DATABASE db1 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

mysql>
Код: bash
CREATE DATABASE db2 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

Выходим из оболочки:

mysql> \q

Теперь восстанавливаем базы из ранее созданного дампа:

#
Код: bash
mysql -v -uroot -p < /tmp/mydb_dump.sql

... или если создавалась резервная копия для одной базы, команда будет с указанием этой базы:

#
Код: bash
mysql -v -uroot -p db < /tmp/mydb_dump.sql

Опять подключаемся к СУБД:

#
Код: bash
mysql -uroot -p

и вводим такую команду:

mysql>
Код: bash
change master to master_host = "192.168.166.155", master_user = "replmy", master_password = "password", master_log_file = "mysql-bin.000015", master_log_pos = 6315;
* 192.168.166.155: IP-адрес моего первого сервера. replmy: учетная запись для репликации, которая была создана при создании кластера. password: пароль для учетной записи replmy. mysql-bin.000015: имя файла, которое мы должны были записать или запомнить (у вас может быть другим). 6315: номер позиции, с которой необходимо начать репликацию (также должны были записать или запомнить ранее).

Запускаем репликацию следующей командой:

mysql>
Код: bash
start slave;

И проверяем состояние репликации:

mysql>
Код: bash
SHOW SLAVE STATUS\G

Состояние Slave_IO_Running и Slave_SQL_Running должно быть Yes, а ошибки должны исчезнуть:

Состояние восстановленной репликации MySQL
  •  

🡱 🡳

Отметьте интересные вам фрагменты текста и они станут доступны по уникальной ссылке в адресной строке браузера.