1.Установка Percona XtraBackup
Centos
1 |
# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm |
1 |
# yum install percona-xtrabackup |
Ubuntu
Импортируем публичный GPG-ключ
1 |
# apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A |
Добавляем репозитарий Percona
1 |
# echo "deb http://repo.percona.com/apt "$(lsb_release -sc)" main" | tee /etc/apt/sources.list.d/percona.list |
Проверяем,что добавился новый репозитарий
1 |
# cat /etc/apt/sources.list.d/percona.list |
1 |
deb http://repo.percona.com/apt trusty main |
Обновляем локальный кеш и устанавливаем пакет
1 |
# apt-get update && apt-get install percona-xtrabackup |
Также можно скачать конкретную версию Percona XtraBackup для требуемой операционной системы с официального сайта Percona
1 |
https://www.percona.com/downloads/XtraBackup/ |
Update: Установка XtraBackup-2.4 на Ubuntu/Debian
1 |
# wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb |
1 |
# dpkg -i percona-release_0.1-4.xenial_all.deb |
1 |
# apt-get update |
1 |
# apt-get install percona-xtrabackup-24 |
2.Создание бекапа всех баз данных(полного бекапа)
1 |
# mkdir /data/backup |
1 |
# innobackupex --user=root --password=123456789 --backup --rsync --parallel=2 /data/backup/ |
1 |
# ls -al /data/backup/ |
1 |
drwx------ 8 root root 4096 Dec 16 14:11 2015-12-16_14-11-01 |
Будет создана подкаталог с текущей датой (например, 2015-12-16_14-11-01).
Также можно указать флаг
1 |
--no-timestamp |
чтобы программа не создавала каталог резервного копирования с текущей временной меткой.
Важно чтобы каталог, куда будет складываться бекап, либо не существовал либо был пустым
(innobackupex по умолчанию не будет перезаписывать уже существующие файлы в каталоге для бекапа и выдаст ошибку)
1 |
# mkdir /data/backup/my_backup |
1 |
# innobackupex --user=root --password=123456789 --backup --rsync --parallel=2 --no-timestamp /data/backup/my_backup |
С флагом или без него, программа должна вернуть в последней строке результата.
1 |
"innobackupex: completed OK!" |
1 2 3 4 5 6 7 |
151216 14:29:50 Backup created in directory '/data/backup/my_backup' 151216 14:29:50 [00] Writing backup-my.cnf 151216 14:29:50 [00] ...done 151216 14:29:50 [00] Writing xtrabackup_info 151216 14:29:50 [00] ...done xtrabackup: Transaction log of lsn (9208114) to (9208114) was copied. 151216 14:29:50 completed OK! |
1 |
--rsync |
используется для ускорения процесса резервного копирования и минимизирования времени блокировки для НЕ InnoDВ-таблиц — FLUSH TABLES WITH READ LOCK
Когда указан —rsync, innobackupex использует Rsync, чтобы скопировать все файлы, отличные от InnoDB, вместо того, чтобы создавать отдельный процесс cp для каждого файла, что может быть намного быстрее на серверах с большим количеством баз данных или таблиц
Innobackupex будет вызывать rsync дважды, один раз перед FLUSH TABLES WITH READ LOCK и один раз во время, чтобы свести к минимуму время блокировки. Во время второго вызова rsync будет синхронизировать только изменения с НЕ-транзакционными данными (если они есть), с момента первого вызова rsync,которвый был выполнен до FLUSH TABLES WITH READ LOCK.
Этот параметр нельзя использовать вместе с параметром –stream или —remote-host
После этого необходимо накатить лог изменений на файл данных.(Это не применимо для инкрементальных бекапов. Подготовка инкрементальных бекапов указана ниже в статье)
Это подготовит бекап к использованию.
Для этого нужно воспроизвести лог транзакций и внести все несовершённые транзакции в резервную копию.Подготовка резервной копии позволяет согласовать и уточнить данные
1 |
--apply-log |
применяет транзакции,указанные в файле xtrabackup_logfile, который был создан утилитой innobackupex в том же каталоге,где распологается сам бекап (/data/backup/2015-12-16_14-11-01) в момент создания бекапа
После этого innobackupex выполнит зафиксированные транзакции в файлах журналов (некоторые транзакции могли быть выполнены во время резервного копирования) и откат незафиксированных. Как только это будет сделано, вся информация будет находится в табличном пространстве (файлы InnoDB), и файлы журналов(ib_logfile*) будут заново созданы.
По умолчанию используется InnoDB-конфигурация с файла backup-my.cnf, который был создан утилитой innobackupex в том же каталоге,где распологается сам бекап (/data/backup/2015-12-16_14-11-01) в момент создания бекапа
Но это можно переопределить с помощью параметра —defaults-file, но обязательным условием является передача этой опции ПЕРВОЙ (innobackupex —defaults-file…..)
1 |
# innobackupex --user=root --password=123456789 --apply-log /data/backup/2015-12-16_14-11-01 |
1 2 3 |
……………………………… InnoDB: Shutdown completed; log sequence number 9208114 151217 18:12:08 completed OK! |
Для ускорения подготовки бекапа может использоваться опция
1 |
--use-memory |
при наличии свободной памяти на сервере.По умолчанию используется 100MB.Например, установим 1G
1 |
--use-memory=1G |
3.Восстановление всех баз данных из бекапа
Останавливаем MySQL-сервер
Centos 7
1 |
# systemctl stop mariadb |
Ubuntu 14
1 |
# systemctl stop mariadb |
Перемещаем старый каталог mysql
Centos 7
1 |
# grep datadir /etc/my.cnf |
1 |
datadir=/var/lib/mysql |
Ubuntu 14
1 |
# grep datadir /etc/mysql/my.cnf |
1 |
datadir = /var/lib/mysql |
1 |
# mv /var/lib/mysql /var/lib/mysql~ |
Перемещаем бекап в /var/lib/mysql
1 |
# mv /data/backup/2015-12-16_14-11-01 /var/lib/mysql |
Либо используем второй вариант
1 |
# mkdir /var/lib/mysql |
1 |
# innobackupex --copy-back /data/backup/2015-12-16_14-11-01 |
После уcпешного выполнения этой команды программа проинформирует
1 |
151216 15:08:29 completed OK! |
Выставляем корректного владельца и группу рекурсивно на каталог /var/lib/mysql
1 |
# chown -R mysql:mysql /var/lib/mysql |
И корректные права на каталог /var/lib/mysql
1 |
# chmod 755 /var/lib/mysql |
Запускаем MySQL-сервер
Centos 7
1 |
# systemctl start mariadb |
Ubuntu 14
1 |
# /etc/init.d/mysql start |
4.Создание инкрементальных бекапов
Например,раз в неделю — полный бекап, раз в сутки – инкрементальный
Рассмотрим на примере один полный и два инкрементальных
Создание полного бекапа
1 |
# innobackupex /data/backup |
1 |
# egrep '(backup_type|lsn)' /data/backup/2015-12-17_18-32-24/xtrabackup_checkpoints |
1 2 3 4 |
backup_type = full-backuped from_lsn = 0 to_lsn = 9280447 last_lsn = 9280447 |
Создание первого инкрементального бекапа
1 |
# innobackupex --incremental /data/backup/ --incremental-basedir=/data/backup/2015-12-17_18-32-24 |
1 |
# egrep '(backup_type|lsn)' /data/backup/2015-12-17_18-41-23/xtrabackup_checkpoints |
1 2 3 4 |
backup_type = incremental from_lsn = 9280447 to_lsn = 9283102 last_lsn = 9283102 |
Альтернативная команда
1 |
# innobackupex --incremental /data/backup/ --incremental-lsn=9283102 |
Создание второго инкрементального бекапа
1 |
# innobackupex --incremental /data/backup/ --incremental-basedir=/data/backup/2015-12-17_18-41-23 |
1 |
# egrep '(backup_type|lsn)' /data/backup/2015-12-17_18-44-34/xtrabackup_checkpoints |
1 2 3 4 |
backup_type = incremental from_lsn = 9283102 to_lsn = 9284756 last_lsn = 9284756 |
Альтернативная команда
1 |
# innobackupex --incremental /data/backup/ --incremental-lsn=9284756 |
Все таблицы отличные от InnoDB-типа будут копироваться каждый раз полностью при инкрементальном копировании т.к у них нет поддержки транзакций, на которых основан механизм инкрементального копирования для InnoDB-таблиц
Подготовка инкрементального бекапа
1.Накатывание изменений на полный бекап
1 |
# innobackupex --apply-log --redo-only /data/backup/2015-12-17_18-32-24/ |
1 2 |
InnoDB: Shutdown completed; log sequence number 9280447 151217 19:07:06 completed OK! |
2. Применение первого инкрементального бекапа к полному бекапу
1 |
# innobackupex --apply-log --redo-only /data/backup/2015-12-17_18-32-24/ --incremental-dir=/data/backup/2015-12-17_18-41-23/ |
1 |
151217 19:12:12 completed OK! |
3.Применение второго инкрементального бекапа к полному бекапу
1 |
# innobackupex --apply-log /data/backup/2015-12-17_18-32-24/ --incremental-dir=/data/backup/2015-12-17_18-44-34/ |
1 |
151217 19:14:59 completed OK! |
Т.к это последний инкрементальный бекап, то не используется опция —redo-only
Далее указан опциональный шаг,который рекомендуется выполнять для ускорения запуска сервера при восстановлении с бекапа
Этот шаг откатывает незавершенные транзакции.
Если его не выполнить в подготовительной части,то при запуске MySQL-сервера сервер баз данных будет выполнять откатывание незавершенных транзакций(ту же самую работу он делает в случае аварии),что
замедлит запуск сервера баз данных
1 |
# innobackupex --apply-log /data/backup/2015-12-17_18-32-24/ |
Восстанавливаем бекап
1 |
# systemctl stop mariadb |
1 |
# mv /var/lib/mysql /var/lib/mysql~ |
1 |
# mkdir /var/lib/mysql |
1 |
# innobackupex --copy-back /data/backup/2015-12-17_18-32-24/ |
1 |
# chown -R mysql:mysql mysql |
1 |
# systemctl start mariadb |
Простой скрипт для создания полного бекапа еженедельно(по воскресеньям) и инкрементального в остальные дни
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/bin/bash DAY_OF_THE_WEEK=`date +%u` BACKUP_DIR=/data/backup LAST_BACKUP=`ls -al ${BACKUP_DIR} | tail -n 1 | awk '{print $9}'` INNOBACKUPEX=`which innobackupex` MAIL=`which mail` BACKUP_LOG=/var/log/backup-xtra.log MYSQL_USER=root MYSQL_PASSWORD=123456789 [ ! -d ${BACKUP_DIR} ] && mkdir ${BACKUP_DIR} if [ ${DAY_OF_THE_WEEK} -eq 0 ] then $INNOBACKUPEX --user=${MYSQL_USER} --password=${MYSQL_PASSWORD} ${BACKUP_DIR} >> ${BACKUP_LOG} 2>&1 if [ $? -ne 0 ] then echo "Backup full is failed" | $MAIL -s "Backup full is failed on `hostname -f`" my@email fi else $INNOBACKUPEX --incremental ${BACKUP_DIR} --incremental-basedir=${BACKUP_DIR}/${LAST_BACKUP} >> ${BACKUP_LOG} 2>&1 if [ $? -ne 0 ] then echo "Backup incremental is failed" | $MAIL -s "Backup incremental is failed on `hostname -f`" my@email fi fi |
Начиная с Percona XtraBackup версии 2.3 innobackupex был переписан на C и настроен как символическая ссылка на xtrabackup.
Innobackupex поддерживает все функции и синтаксис также ,как и в версии 2.2, но теперь он устарел и будет удален в следующей major версии. Синтаксис для новых функций не будет добавлен в innobackupex, только для xtrabackup.
Используем xtrabackup для создания, подготовки и восстановления бекапа
Полный цикл по созданию,подготовки и восстановлению ПОЛНОГО бекапа всех баз данных
1.Создание бекапа (—backup) с сжатем(—compress) в 2 потока одновременно(—compress-threads)
1 |
# xtrabackup --user=root --password=mypassword --backup --no-timestamp --rsync --compress --compress-threads=2 --target-dir=/backup-xtrabackup/$(date +"%Y-%m-%d") |
Если нет необходимости сжимать бекап для экономии дискового пространства,то используем
1 |
# xtrabackup --user=root --password=mypassword --backup --no-timestamp --rsync --target-dir=/backup-xtrabackup/$(date +"%Y-%m-%d") |
Перед подготовкой бекапа(накатыванием транзакционных логов) сжатые файлы должны бать расжаты (если использовалась опция –compress при создании бекапа)
Для расжатия используется утилита qpress
Установка qpress
Ubuntu(при подключенном репозитарии Percona)
1 |
# apt-get install qpress |
Centos(при подключенном репозитарии Percona)
1 |
# yum install qpress |
Либо загружаем готовый бинарник
1 |
# wget http://www.quicklz.com/qpress-11-linux-x64.tar && tar xvf qpress-11-linux-x64.tar |
1 |
# mv qpress /usr/local/bin/ |
2. Расжатие бекапа(—decompress) с удалением сжатых файлов после расжатия(—remove-original)
1 |
# xtrabackup -user=root --password=mypassword --decompress --remove-original --target-dir=/backup-xtrabackup/$(date +"%Y-%m-%d") |
3.Подготовка бекапа
1 |
# xtrabackup -user=root --password=mypassword --prepare --use-memory=1G --target-dir=/backup-xtrabackup/$(date +"%Y-%m-%d") |
4.Восстановление бекапа
1 |
# service mysql stop |
1 |
# mv /var/lib/mysql /var/lib/mysql~ |
1 |
# xtrabackup --user=root --password=mypassword --copy-back --target-dir=/backup-xtrabackup/$(date +"%Y-%m-%d") |
1 |
# chown -R mysql:mysql /var/lib/mysql |
1 |
# service mysql start |
Скрипт для ежедневного создания ПОЛНОГО бекапа всех баз данных
Добавляем в планировщик cron задание на ежесуточный запуск скрипта по выполнению бекапа с позиционной переменной
1 |
backup-with-compress |
1 |
# nano /etc/cron.d/backup-databases-xtrabackup |
1 |
30 2 * * * root /usr/local/scripts/backup-databases-xtrabackup.sh backup-with-compress > /dev/null 2>&1 |
Для декомпресси и подготовки бекапа, когда понадобится восстанвоить секапа используем соотвественно позиционные переменные
1 |
backup-decompress |
1 |
backup-prepare |
Системы мониторинга (Nagios/Zabbix) при необходимости мониторят файл /var/log/backup-xtrabackup-report.log для мониторинга успешности/неуспешности создания бекапа
1 |
# chmod +x /usr/local/scripts/backup-databases-xtrabackup.sh |
1 |
# nano /usr/local/scripts/backup-databases-xtrabackup.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
#!/bin/bash DATE="$(date +"%Y-%m-%d")" STORAGEDIR="/backup-xtrabackup/$DATE/" XTRABACKUP=$(which xtrabackup) XTRABACKUP_OPTIONS="--backup --no-timestamp --rsync" LOGFILE="/var/log/backup-xtrabackup.log" LOGFILE_REPORT="/var/log/backup-xtrabackup-report.log" MUSER="myuser" MPASSWORD="mypassword" ECHO=$(which echo) MKDIR=$(which mkdir) FIND=$(which find) XARGS=$(which xargs) CAT=$(which cat) RM=$(which rm) $CAT /dev/null > ${LOGFILE_REPORT} function backup-without-compress { [ ! -d $STORAGEDIR ] && $MKDIR -p $STORAGEDIR $XTRABACKUP --user=$MUSER --password=$MPASSWORD ${XTRABACKUP_OPTIONS} --target-dir=$STORAGEDIR > $LOGFILE 2>&1 if [ $? -ne 0 ] then $ECHO "Backup is failed full Databases - $DATE" | tee ${LOGFILE_REPORT} else $ECHO "Backup full Databases completed successfully! Backup up to $DATE " | tee -a ${LOGFILE_REPORT} fi } function backup-with-compress { [ ! -d $STORAGEDIR ] && $MKDIR -p $STORAGEDIR $XTRABACKUP --user=$MUSER --password=$MPASSWORD ${XTRABACKUP_OPTIONS} --compress --compress-threads=2 --target-dir=$STORAG$ if [ $? -ne 0 ] then $ECHO "Backup is failed full Databases - $DATE" | tee -a ${LOGFILE_REPORT} else $ECHO "Backup full Databases completed successfully! Backup up to $DATE " | tee -a ${LOGFILE_REPORT} fi } function backup-decompress { $XTRABACKUP --user=$MUSER --password=$MPASSWORD --decompress --remove-original --target-dir=$STORAGEDIR >> $LOGFILE 2>&1 if [ $? -ne 0 ] then $ECHO "Decompress backup is failed - $DATE" | tee -a ${LOGFILE_REPORT} else $ECHO "Decompress backup completed successfully! $DATE " | tee -a ${LOGFILE_REPORT} fi } function backup-prepare { $XTRABACKUP --prepare --use-memory=1G --target-dir=$STORAGEDIR >> $LOGFILE 2>&1 if [ $? -ne 0 ] then $ECHO "Prepare is failed 1-th prepare - $DATE" | tee -a ${LOGFILE_REPORT} fi } function help { echo "Please, choose one of the next operation:" echo "backup-with-compress to create backup with compress" echo "backup-without-compress to create backup without compress" echo "backup-decompress to decompress backup " echo "backup-prepare to prepare backup" } case $1 in backup-with-compress) backup-with-compress ;; backup-without-compress) backup-without-compress ;; backup-decompress) backup-decompress ;; backup-prepare) backup-prepare ;; help|--help|-help) help ;; *) help ;; esac #$FIND /backup-xtrabackup -maxdepth 1 -type d -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" -mtime +7 | $XARGS $RM -rf $FIND /backup-xtrabackup -mindepth 1 -maxdepth 1 -type d -mtime +7 | $XARGS $RM -rf |
Источник:
http://habrahabr.ru/company/centosadmin/blog/229731/
http://ruhighload.com/post/Xtrabackup
http://www.8host.com/blog/goryachee-rezervnoe-kopirovanie-dannyx-mysql-pri-pomoshhi-percona-xtrabackup-v-centos-7/
https://ramses2000.net/2015/02/02/xtrabackup/