Создание горячей резервной копии MySQL с одновременным копированием на удаленный сервер

Довольно часто встречается ситуация когда MySQL разросся до размеров в десятки и сотни гигабайт, место для резервной копии на сервере уже нет, а нужно создать копию всех баз и переместить ее на удаленный сервер. Иногда встречается ситуация, когда нужно развернуть полную копию MySQL на другом сервере.

В данной статье я расскажу как при помощи Percona Xtrabackup можно легко и быстро делать горячие резервные копии MySQL (горячие — значит без остановки MySQL) с одновременным перемещением копии на удаленный сервер, при этом на локальном сервере резервная копия не оседает и не занимает место, что очень удобно.

Исходные данные: Ubuntu 18.04 (bionic), Oracle MySQL 5.7.29
Задача: Создать горячую (hotbackup) резервную копию MySQL и переместить ее на удаленный сервер, при этом не сохраняя ее на текущем сервере, чтобы не занимать драгоценное место.

Для начала нам нужно установить Percona Xtrabackup и набор утилит qpress, socat, nc на оба сервера. Если все утилиты у Вас уже установлены, то пропустите этот шаг.

1. Скачиваем и устанавливаем пакет percona-release_latest, включаем репозитарий percona tools (release) и устанавливаем набор полезных утилит от Percona Toolkit, устанавливаем Percona Xtrabackup и вспомогательные утилиты qpress, socat

wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb && rm -f percona-release_latest.$(lsb_release -sc)_all.deb
percona-release enable-only tools release
apt-get update
apt-get install -y percona-toolkit percona-xtrabackup-24 qpress socat screen

2. На сервере приемнике (куда будем копировать резервную копию) создаем каталог, куда будет загружаться резервная копия и запускаем socat + xbstream. Все действия выполняем находясь под пользователем root. Перед запуском Вы должны проверить, что на сервере-приемнике достаточно места на файловой системе для приема бэкапа. Запускать socat желательно в screen чтобы в случае обрыва ssh сессии процесс приема не прервался.

mkdir /root/mysqlbackup
screen
socat -u tcp-listen:9999,reuseaddr stdout 2>/tmp/socat.log | xbstream -x -C /root/mysqlbackup

на что следует обратить внимание:
а) Директива tcp-listen:9999 указывает, что мы будем принимать входящие подключения по протоколу TCP на порт 9999, не забудьте открыть порт на межсетевом экране;
б) Принятый поток будет передаваться xbstream, а тот будет сохранять данные в каталог /root/mysqlbackup, проверьте чтобы на диске было достаточно места для данных. Сколько необходимо? Столько, сколько на источнике занимает каталог с данными MySQL, как правило это /var/lib/mysql, но он может меняться, смотрите на источнике в MySQL настройку datadir, она покажет каталог хранения данных.

3. На источнике запускаем xtrabackup в формат потокового резервного копирования xbstream. Запускать xtrabackup желательно в screen чтобы в случае обрыва ssh сессии процесс создания и передачи резервной копии не прервался.

screen
ulimit -n 256000 && /usr/bin/xtrabackup --defaults-file=/etc/mysql/my.cnf --host=127.0.0.1 --port 3306 --user=root --password=mysqlrootpasswd --backup --no-backup-locks --no-lock --parallel=4 --stream=xbstream | socat - TCP4:172.16.0.1:9999

на что следует обратить внимание:
а) Директива —defaults-file указывает местоположение файла конфигурации MySQL, это директива должна быть самой первой в списке;
б) Директивы —host, —port, —user и —password указывают соответствующие опции подключения к работающему MySQL, это у Вас они будут своими, как минимум пароль пользователя root;
в) Директива —no-backup-locks указывает, что не нужно делать блокировок при резервном копировании;
г) Директива —no-lock указывает, что не нужно делать блокировок таблиц при резервном копировании;
д) Директива —parallel указывает, во сколько потоков будет идти резервное копирование;
е) Директива —stream указывает формат потокового резервного копирования;
ж) Директива для socat — TCP4:172.16.0.1:9999 — указывают протокол, IP адрес и порт приемника, это адрес сервера из п.2;

После запуска xtrabackup начнется процесс создания горячей резервной копии и одновременной передачи её на сервер-приемник.

В следующей статье я расскажу как можно восстановить полностью рабочий экземпляр MySQL из созданное нами резервной копии.

На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.


Подписаться
Уведомить о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

5 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Andrew
Andrew
4 лет назад

Добрый день! Подскажите с какого размера базы Mysql нужно использовать percona, вроде как если размер базы менее 10 гб то ещё используется mysqldump

Глеб
Глеб
3 лет назад
Ответить на  Михаил Григорьев

xtrabackup(innobackupex) поддерживает копию одиночных таблиц, но по мимо них он всегда копирует ibdata+стандартную схему mysql и грязные журналы для соглосования). Все завист от того, включен ли innodb_file_per_table(в percona включен по умолчанию). Дальше можно сделать xtrabackup prepare и импортировать таблицу на другой сервер.
—no-backup-locks —no-lock
Это весьма опастные операции когда используется myisam + нужна согласованная точка бинлога для реплики. Я бы лучше перевел таблицы на innodb(если это возможно) чем ставил данные опции.

Владимир
Владимир
2 лет назад

Добрый день, спасибо за статью. При создании бэкапа, получаю такую ошибку PXB will not be able to make a consistent backup. Retry the backup operation.

5
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x