В этой заметке я опишу свой процесс установки, настройки и использования утилиты для создания резервной копии баз MySQL, которая называется Percona XtraBackup. Ниже описанные действия происходят в системе CentOS 7.
Для начала я обращаюсь к первоисточнику информации, т.е. на официальный сайт. На данный момент доступна версия 2.4. Перехожу в нужный раздел и смотрю варианты установки. Устанавливаем репозиторий.
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
Проверяем доступность пакетов в репозитории.
yum list | grep percona
У меня выдало достаточно много информации. Вот фрагмент.
.... Percona-XtraDB-Cluster-test-57.x86_64 5.7.16-27.19.1.el7 percona-release-x86_64 jemalloc-debuginfo.x86_64 3.3.1-1.el7 percona-release-x86_64 libtokumx-enterprise.x86_64 2.0.2-1.el7 percona-release-x86_64 libtokumx-enterprise-devel.x86_64 2.0.2-1.el7 percona-release-x86_64 percona-cacti-templates.noarch 1.1.7-2 percona-release-x86_64 percona-nagios-plugins.noarch 1.1.7-2 percona-release-x86_64 percona-toolkit.noarch 2.2.20-1 percona-release-noarch percona-xtrabackup.x86_64 2.3.6-1.el7 epel percona-xtrabackup-22.x86_64 2.2.13-1.el7 percona-release-x86_64 percona-xtrabackup-22-debuginfo.x86_64 2.2.13-1.el7 percona-release-x86_64 percona-xtrabackup-24.x86_64 2.4.5-1.el7 percona-release-x86_64 percona-xtrabackup-24-debuginfo.x86_64 2.4.5-1.el7 percona-release-x86_64 ....
Установка
yum install percona-xtrabackup-24
Подготовка пользователя mysql
mysql -u root -p CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bkppassword'; GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost'; FLUSH PRIVILEGES; exit
Выставляем нужные права на каталог.
sudo chown -R mysql: /var/lib/mysql sudo find /var/lib/mysql -type d -exec chmod 775 "{}" \;
Бэкап
Для создания бэкапа выполняю команду.
sudo innobackupex --user=bkup --password=host3up --no-timestamp /data/backups/new_backup
Тут уже вбиты мои имя пользователя и пароль (помечено красным). Пароль простой, т.к. выполняю всё теста на локальной машине.
Если возникает такого рода ошибка:
InnoDB: Error: log file ./ib_logfile0 is of different size 5242880 bytes InnoDB: than specified in the .cnf file 50331648 bytes!
Вариант решения по ссылке — https://ruhighload.com/post/Mysql+error+ib_logfile0+is+of+different+size
В моём случае на debian в файле /etc/mysql/my.cnf не было строчки innodb_log_file_size = 5M и я её добавил.
Can't locate Digest/MD5.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at - line 693. BEGIN failed--compilation aborted at - line 693. 170210 23:35:06 Connecting to MySQL server host: localhost, user: bkup, password: set, port: 0, socket: /var/lib/mysql/mysql.sock Using server version 5.5.52-MariaDB Error: failed to execute query SHOW ENGINE INNODB STATUS: Access denied; you need (at least one of) the PROCESS privilege(s) for this operation
Тут две ошибки. Обходим эти грабельки. Устанавливаю Diest-MD5
sudo yum install perl-Digest-MD5
И заходим в mysql, там выполняем команду, которая устранит вторую ошибку с Access denied:
GRANT SELECT, PROCESS ON *.* TO 'bkup'@'localhost';
Теперь повторяю команду резервного копирования.
sudo innobackupex --user=bkup --password=host3up --no-timestamp /data/backups/new_backup
Всё проходит успешно. В нужной директории я получаю файлы бэкапа.
[root@localhost new_backup]# ls -l итого 18456 -rw-r----- 1 root root 417 фев 10 23:49 backup-my.cnf -rw-r----- 1 root root 18874368 фев 10 23:49 ibdata1 drwxr-x--- 2 root root 4096 фев 10 23:49 mysql drwxr-x--- 2 root root 4096 фев 10 23:49 performance_schema drwxr-x--- 2 root root 301 фев 10 23:49 wphost3 -rw-r----- 1 root root 113 фев 10 23:49 xtrabackup_checkpoints -rw-r----- 1 root root 456 фев 10 23:49 xtrabackup_info -rw-r----- 1 root root 2560 фев 10 23:49 xtrabackup_logfile
Данный вариант позволит создать только один бэкап. Если повторить команду ещё раз, то будет ошибка, т.к. файлы бэкапа уже существует и не будут перезаписываться. Можно пропустить флаг —no-timestamp, чтобы программа XtraBackup создала каталог резервного копирования с текущей временной меткой. Выполнив команду повторно, я получил бэкап в тот же каталог и туда был добавлен файл с временной меткой.
drwxr-x--- 5 root root 175 фев 11 00:02 2017-02-11_00-02-06 -rw-r----- 1 root root 417 фев 10 23:49 backup-my.cnf -rw-r----- 1 root root 18874368 фев 10 23:49 ibdata1
Если выполнить ещё раз, опять будет создан файл с временной меткой и т.д.
drwxr-x--- 5 root root 175 фев 11 00:02 2017-02-11_00-02-06 drwxr-x--- 5 root root 175 фев 11 00:08 2017-02-11_00-07-58 -rw-r----- 1 root root 417 фев 10 23:49 backup-my.cnf -rw-r----- 1 root root 18874368 фев 10 23:49 ibdata1
Использование бэкапа.
Для использования бэкапа необходимо его подготовить.
innobackupex --apply-log /data/backups/new_backup
Данная команда применит к базе все последние действия, которые происходили с ней во время бэкапа (чтобы не останавливать работу базы, эти действия писались в лог).
Чтобы восстановление шло быстрее, если позволяют ресурсы, то можно использовать опцию use-memory:
innobackupex --apply-log --use-memory=4G /path/to/BACKUP-DIR
Теперь искусственно вызываем ситуацию, чтобы воспользоваться бэкапом. Останавливаем СУБД и безопасно переносим рабочие базы во временную папку.
systemctl stop mariadb mkdir /tmp/mysql mv /var/lib/mysql/* /tmp/mysql/
Если запустить СУБД, то мой тестовый хост покажет:
Error establishing a database connection
Всё можно исправить командой:
innobackupex --copy-back /data/backups/new_backup
Она должна восстановить все базы на место. Файлы восстановленного бэкапа имеют права того пользователя, который делал восстановление. Поэтому это дело необходимо исправить, отдав права mysql. И запустить снова СУБД.
sudo chown -R mysql: /var/lib/mysql sudo systemctl start mariadb
Теперь все базы успешно восстановлены. Проверяю доступен ли мой тестовый хост и правильно ли он функционирует. Всё в порядке.
Автоматические копии
Неплохо было бы, если копии создавались самостоятельно без участия пользователя. Для этого я создам скрипт и буду запускать его при помощи cron.
#!/bin/bash sudo innobackupex --user=bkup --password=host3up /data/backups/new_backup
Дам ему права на выполнение.
chmod +x bkup.sh
И прописываю в cron (для теста какое-нибудь частый интервал, чтобы следить работу). Например, раз в час.
0 */1 * * * root /var/mybash/bkup.sh
При написании данной статьи использовался материал ТЫЦ.