Иногда встречается ситуация, когда нужно развернуть полную копию MySQL на другом сервере.
Существует ряд инструментов, которые позволяют это сделать. Наиболее популярый способ, это пожалуй - использование mysqldump, но у метода есть ряд минусов:
- во-первых, приводит к блокировкам
- во-вторых, на больших базах длиться десятки минут и даже часы (десятки часов).
Единственный плюс mysqldump — это возможность сделать копию баз(ы) в «человеко-читаемом» формате или сделать копию только определенных частей базы (структуру всех таблиц или выбранных, данные всей базы или только нужных таблиц и т.д.)
В данной заметке описан другой продукт: Percona Xtrabackup -он позволяет делать горячие резервные копии всего экземпляра MySQL, нельзя сделать бэкап одной базы. Размер не имеет значения, можно использовать Percona Xtrabackup на базах размером и 500 MB и 150 GB.
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. На сервере приемнике (куда будем копировать резервную копию) создаем каталог, куда будет загружаться резервная копия и запускаем:
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 из созданной нами резервной копии.
Cпасибо автору!
Источник: