Для создания бэкапа, требуется запустить xtrabackup с опцией --backup. Также можно указать опцию --target-dir, которая указывает на директорию, где будет создан бэкап. Если директория для создания бэкапа не существует, xtrabackup создаст ее. Если директория существует и пустая, то xtrabackup также создаст бэкап. Xtrbackup не перезапишет существющие файлы, бэкап не будет создан с ошибкой operating system error 17, file exists.
Пример команды для создания полного резервного бэкапа всех баз
xtrabackup --backup --datadir=/var/lib/mysql/ --target-dir=/data/backups/mysql/
Выполнение данной команды создаст полный бэкап всех баз, которые находятся в директории /var/lib/mysql, в директории /data/backups/mysql/
Во время процесса резервного копирования, вы можете наблюдать большой объем вывода информации о том какие файлы были скопированы, какие логи были просканированны и также скопированы. Ниже пример того как это может выглядеть:
>> log scanned up to (3646475465483)
>> log scanned up to (3646475517369)
>> log scanned up to (3646475581716)
>> log scanned up to (3646475636841)
>> log scanned up to (3646475718082)
>> log scanned up to (3646475988095)
>> log scanned up to (3646476048286)
>> log scanned up to (3646476102877)
>> log scanned up to (3646476140854)
[01] Copying /var/lib/mysql/var/ibdata1
to /var/lib/mysql/Backups/2020-12-07_21-11-15/ibdata1
[01] ...done
После того как выполнение полного резервного копирования завершено, директория для создания полных бэкапов будет содержать примерно следующую информацию. Предположим, что есть база данных test с одной InnoDB таблицей test.tbl1 и используется опция MySQL innodb_file_per_table:
/data/backups/mysql/ibdata1
/data/backups/mysql/test
/data/backups/mysql/test/tbl1.ibd
/data/backups/mysql/xtrabackup_checkpoints
/data/backups/mysql/xtrabackup_logfile
Создание полной резервной копии может занимать длительное время, это зависит от того какой объем базы или баз. Абсолютно безопасно отменить создание полного резервного копирования в любой момент времени, потому что при создании полного бэкапа файлы с базами данных не модифирцируются.
Следующим шагом будет подготовка созданного бэкапа для восстановления.
После того как вы создали полную резервную копию c опцией --backup, следюущий шаг это подготовка к восстановлению. Файлы информационной базы не консистентны на текущий момент времени, до того момента пока они не будут подготовлены к восстановлению, потому что они были скопированы в разное время, когда программа была запущена и также они могли быть изменены в процессе создания резервной копии. Если вы попробуете запустить MySQL с этими данными, то он он обнаружит, что данные повреждены и не запустится на поврежденных файлах. Опция --prepare позволяет сделать файлы идеально консистентными в единый момент времени, после этого можно будет запускать файл используя подготовленные файлы базы данных и MySQL после этого запустится корректно.
Использовать опцию --prepare довольно просто: необходимо запустить команду xtrabackup с опцией --prepare и указать путь к директории --target-dir.
Пример команды для подготовки полной резервной копии для восстановления:
xtrabackup --prepare --target-dir=/data/backups/mysql/
Когда команда завершит свою работу, вы увидите сообщение "InnoDB shutdown" с последующим текстом примерно следующего содержания:
101107 16:40:15 InnoDB: Shutdown completed; log sequence number
Не рекомендуется прерывать процесс подготовки бэкапа, это может повредить файлы, которые были созданы в процессе резервного копирования.
Если вы планируете создать полный бэкап, которые впоследствии будет использоваться для создания инкрементных бэкпов, вы должны использовать опцию --apply-log-only во время подготовки бэкапа или вы не сможете применить инкрементный бэкап к полному бэкапу.
Пример команды для подготовки полного бэкапа, который впоследствии будет использоваться для создания инкрментных:
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/
Xtrabackup не содержит в себе функциональности для восстановления бэкапа. Это задача на усмотрение пользователя. Вы можете использовать cp или rsync для восстановления файлов. После восстановления необходимо проверить, что восстановленные файлы имеют корректного владельца и права (владелец и группа должны быть mysql)
Пример команды восстановления полного бэкапа:
cp -Rp /data/backups/mysql /var/lib/mysql/
В данном случае /data/backups/mysql это директория в которой находится полная резервная копия, а /var/lib/mysql это директория в которую будет восстановлена резервная копия.
Обратите внимание, что при восстановлении необходимо полностью удалять директорию, которую требуется восстановить.
После восстановления, требуется указать корректного владельца и группу:
chown -R mysql:mysql /var/lib/mysql
Вы можете создать много инкремнтных бэкапов между полными бэкапами, таким образом вы можете настроить процесс создания полных резервных копий раз в неделю, а создание инкрементных резервных копий каждый день или создавать полные резервные копии раз в день, а инкрментные резервные копии раз в час.
Инкрементные резервные копии работают, потому что каждая InnoDB страница (обычно 16 Кб в размере) содержит порядковый номер журнала или LSN. LSN порядковый номер для всей базы данных. Каждая страница LSN показывает как часто она изменялась. Инкрементный бэкап копирует каждую таблицу у которой LSN новее, чем в предыдущей инкрементной или полной резервной копии.
Инкрементные бэкапы не сравнивают различающиеся файлы информационной базы с предыдущими бэкапами. Фактически вы можете сделать инкрементный бэкап, используя опцию --incremental-lsn даже без использования предыдущей резервной копии, если вам известен LSN. Инкрементные бэкапы просто считывают страницы и сравнивают их LSN с LSN из последнего бэкапа. Вам все еще необходимо создавать полные резервные копии для создания инкрментных бэкапов. Имейте в виду, что инкрментные бэкапы, без полных бэкапов полностью бесполезны.
Для создания первичного (первого) инкрементного бэкапа для начала создайте полный бэкап. Xtrabackup создает файл с названием xtrabackup_checkpoints в директории, которая назначена для создания инкрементных резервных копий. Файл содержит строку to_lsn, которая указывает на LSN в конце последней резервной копии.
Стандартный цикл создания полного и инкрементного бэкапа:
- Создаем полный бэкап
xtrabackup --backup --target-dir=/data/backups/base
Если вы откроете и посмотрите на файл xtrabackup_checkpoints, то вы сможете увидеть примерно следующую информацию:
backup_type = full-backuped from_lsn = 0 to_lsn = 1291135
backup_type - показывает тип и состояние бэкапа, в данном случае указано, что создан полный бэкап from_lsn - показывает номер lsn от которого был создан бэкап to_lsn - показывает номер lsn до которого был создан бэкап
Теперь, когда у вас есть полный бэкап, вы можете создать инкрментный бэкап.
- Создаем первичный инкрементный бэкап
xtrabackup --backup --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base
Директория /data/backups/inc1 теперь содержит дельту между файлами, такими как ibdata1.delta and test/table1.ibd.delta, если использовать такие же базы данных, как в примере в самом начале статьи. Они представляют собой изменения с LSN 1291135 до 1291340. Если вы посмотрите xtrabackup_checkpoints файл в директории с созданным первичным инкрментным бэкапом, вы сможете увидеть прилизительно следующую информацию:
backup_type = incremental from_lsn = 1291135 to_lsn = 1291340
Теперь вы можете создать дополнительный инкрементный бэкап в дополнение к первичному инкрментному бэкапу, используя его директорию как основу.
- Создаем дополнительный инкрементный бэкап
xtrabackup --backup --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1
Подготовка инкрементных бэкапов, используя опцию --prepare это не то же самое как это делается в полных бэкапах. В полных бэкапах, два типа операций применяются: сделать базу данных косистентной (завершенные транзакции выполняются повторно из файла журнала с дельта-файлами и и незавершенные транзакции, которые выполнялись во время создания бэкапа, откатываются. Необходимо пропускать откат незавершенных транзакций, когда будет выполняться подготовка инкрментного бэкапа, потому что транзакции, которые были незавершены во время создания инкрментного бэкапа могли быть в процессе выполнения и весьма вероятно будут выполнены во время следующего инкрментного бэкапа. Необходимо использовать опцию --apply-log-only для предотвращения операции отката незавершенных транзакций.
Если вы не будете использовать опцию --aply-log-only, в таком случае инкрментные бэкапы будут бесполезны. После того как транзакции будут отменены, следующие бэкапы применены не будут.
Начнем с полной резервной копии, вы можете подготовить ее и после этого применить к этой копии инкрментные бэкапы. Допустим у нас есть следующие бэкапы:
/data/backups/base - полный бэкап (full backup) /data/backups/inc1 - первчиный инкрементный бэкап (diff backup) /data/backups/inc2 - дополнительный инкрментный бэкап (diff backup)
To prepare the base backup, you need to run --prepare as usual, but prevent the rollback phase:
Для подготовки полного бэкапа, вам также необходимо использовать опцию --prepare, но теперь также необходимо добавить опцию --apply-log-only, для того, чтобы исключить опцию отмены невыполненных транзакций
Стандартный цикл подговки связки полного и инкрментного бэкапа для восстановления
- Начнем с подготвки полного бэкапа для восстановления
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base
Будет выведен текст примерного следующего содержания:
101107 20:49:43 InnoDB: Shutdown completed; log sequence number 1291135
Для того чтобы применить первый инкрментный бэкап к полному бэкапу, вам требуется выполнить следующую команду:
- Подготовка и применение первичного инкрментного бэкапа к полному бэкапу
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1
Для того чтобы применить следующий инкрментный бэкап, используется похожая команда
- Подготовка и применение следующего инкрментного бэкапа к полному бэкапу
xtrabackup --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/inc2
Структура файлов
├── configure_backup # Конфигурационный файл содержащий необходимые перееменные для резервного копирования
├── diff-backup_next.sh # Скрипт создания следующего инкрементного бэкапа
├── diff-backup.sh # Скрипт создания первичного инкрементного бэкапа
├── diff-prepare.sh # Скрипт для подготовки инкрментных бэкапов к восстановлению
├── full-backup.sh # Скрипт для создания полного бэкапа
├── full-restore.sh # Скрипт для восстановления полного бэкапа
├── menu-backup.sh # Скрипт открывающий меню резервного копирования
├── cron # Директория в которой находятся скрипты и конфигурационные файлы для настройки и работы cron
│ ├── configure_cron # Конфигурационный файл содержащий необходиые переменные для настройки cron
│ ├── cron-setup.sh # Скрипт для иницализации cron
│ ├── diff-backup.job # Скрипт для создания первичного инкрементного бэкапа через cron
│ ├── diff-backup_next.job # Скрипт для создания следующего инкрментного бэкапа через cron
│ └── full-backup.job # Скрипт для создания полного бэкапа через cron
- Необходимо определиться и создать постоянную директорию, в которой будут хранится все необходимые работы скрипты
- Необходимо указать требуемые параметры в configure_backup
- Необходимо указать требуемые параметры cron/configure_cron
- Если требуется настроить cron, то после внесения изменений в файлы configure_backup и cron/configure_cron, выполните скрипт cron/cron_setup.sh (подробнее указано ниже)
Примечание
Не перемещайте файлы со скриптами в другую директорию,
если вы уже указали все настройки в файле configure_backup
и configure_cron
Пример файла configure_backup
BACKUP_DIR=/tmp/backup # директория для всех бэкапов
DATABASE=mysql # выбор базы данных для резервного копирования и восстановления
TIMESTAMP=`date +%Y-%m-%d` # переменная для получения текущей даты
TIME=`date +%H-%M-%S` # переменная для поучения текущего времени
FULL_DST=$BACKUP_DIR/full # директория для создания полных бэкапов
DIFF_DST=$BACKUP_DIR/diff # директория для создания инкрементных бэкапов
LOCATION="/root/backup" # корневая директория где находятся все скрипты для выполнения резервного копирования
FULL_BACKUP_SCHEDULE=`echo 0 23 '*' '*' 1-5` # расписание создание полных резервных копий
DIFF_BACKUP_SCHEDULE=`echo 0 10-18 '*' '*' 1-5` # расписание создания инкрементных резервных копий
array=( $(find $FULL_DST -maxdepth 1 -type d -name '20*' | cut -c 17- | sort) ) # поиск последнего полного бэкапа
LAST_FULL_BACKUP=`echo ${array[-1]} `
array=( $(find $DIFF_DST -maxdepth 1 -type d -name '20??-??-??' | cut -c 18- | sort) ) # поиск последнего инкрементного бэкапа в определенном формате
LAST_DIFF_BACKUP=`echo ${array[-1]}`
diff_base_dir=( $(find $DIFF_DST -type d -name '20*' | cut -c 18- | sort) ) # поиск последнего инкрементного бэкапа
array_next=( $(find $DIFF_DST -type d -name '20??-??-??-??-??-??' | cut -c 18- | sort) ) # поиск последнего инкрементного бэкапа
LAST_DIFF_NEXT_BACKUP=`echo ${array_next[-1]}` # последний инкрементный бэкап, который был создан после первичного инкрементного бэкапа
DIFF_BASE_DIR=`echo ${diff_base_dir[-1]}` # название директории с последним инкрементным бэкапом
Пример файла configure_cron
BACKUP_DIR=/tmp/backup # директория для всех бэкапов
DATABASE=mysql # выбор базы данных для резервного копирования и восстановления
TIMESTAMP=`date +%Y-%m-%d` # переменная для получения текущей даты
TIME=`date +%H-%M-%S` # переменная для поучения текущего времени
FULL_DST=$BACKUP_DIR/full # директория для создания полных бэкапов
DIFF_DST=$BACKUP_DIR/diff # директория для создания инкрементных бэкапов
LOCATION="/root/backup" # корневая директория где находятся все скрипты для выполнения резервного копирования
FULL_BACKUP_SCHEDULE=`echo 0 23 '*' '*' 1-5` # расписание создание полных резервных копий
DIFF_BACKUP_SCHEDULE=`echo 0 10-18 '*' '*' 1-5` # расписание создания инкрементных резервных копий
array=( $(find $FULL_DST -maxdepth 1 -type d -name '20*' | cut -c 17- | sort) ) # поиск последнего полного бэкапа
LAST_FULL_BACKUP=`echo ${array[-1]} `
array=( $(find $DIFF_DST -maxdepth 1 -type d -name '20??-??-??' | cut -c 18- | sort) ) # поиск последнего первичного инкрементного бэкапа
LAST_DIFF_BACKUP=`echo ${array[-1]}` # поиск последнего инкрементного бэкапа с определенном формате
diff_base_dir=( $(find $DIFF_DST -type d -name '20*' | cut -c 18- | sort) ) # поиск последнего инкрементного бэкапа
array_next=( $(find $DIFF_DST -type d -name '20??-??-??-??-??-??' | cut -c 18- | sort) ) # поиск последнего вторичного инкрементного бэкапа
LAST_DIFF_NEXT_BACKUP=`echo ${array_next[-1]}` # массив из найденных инкрментных бэкапов
DIFF_BASE_DIR=`echo ${diff_base_dir[-1]}` # массив из найденных инкрментных бэкапов в другом формате
После того как указана вся информация в файлах configure_backup и cron/configure_cron, можно включить задания на выполнения cron задач
Заходим в директорию cron и из этой директории выполняем скрипт cron_setup.sh
Внимание
Данный скрипт необходимо выполнять только один раз при первоначальной настройке.
Если вы внесли изменения в cron_setup.sh, то перед повторным выполнением необхоимо
выполнить следующие действия:
1. Удалите все задания из cron связанные с созданием бэкапов через xtrabackup
crontab -e
2. Найдите в списке те задания, которые относятся к xtrabackup и удалите их
Нажатие кнопки d два раза удаляет строку (если у вас открылся crontab через vi)
3. Откройте файл $HOME/.bashrc и удалите из него строчку, которая начинается с LOCATION=
vi $HOME/.bashrc
Включение cron задач по созданию полных и инкрементных копий
cd <путь к директории, где хранятся скрипты>/cron (например: cd /root/backup/cron)
chmod u+x cron_setup.sh
./cron_setup.sh
Требуется запустить меню резервного копирования (menu_backup.sh) и выполнить опции из списка в следующем порядке ниже:
Запуск меню резервного копирования
cd <путь к директории, где хранятся скрипты> (например: cd /root/backup)
./menu-backup.sh
- Создать полный бэкап
- Создать инкрементный бэкап
- Создать инкрементный бэкап
- Применить все инкрементные бэкапы к полному
- Восстановить полный бэкап
- Перейдите в директорию в которой хранятся скрипты
cd <директория, в которой хранятся скрипты> (например: cd /root/backup/)
- Запуск скрипта, который создает полный бэкап (если он еще не был сегодня создан)
chmod u+x full-backup.sh
./full-backup.sh
- Запуск скрипта, который создает первичный или дополнительный инкрементный бэкап (в зависимости от того создали вы уже сегодня инкрементный бэкап или нет)
chmod u+x diff-backup.sh
./diff-backup.sh
- Запуск скрипта, который применяет и подготавливает все сегодняшние инкрементные бэкапы к полному бэкапу
chmod u+x diff-prepare.sh
./diff-prepare.sh
- Запуск скрипта, который восстанавливает последний полный бэкап или полный бэкап + инкрементный бэкап с заменой исходной базы (операция необратима)
chmod u+x full-restore.sh
./full-restore.sh