Содержание

Percona XtraBackup: Бэкап и создание отдельной базы

Не всегда восстановление базы данных происходит на новом сервере, как было описано в Percona XtraBackup базы или таблицы. Иногда необходимо развернуть копию базы данных на сервере, где уже есть несколько баз. Например, на тестовых серверах, где проходит разработка. Да и возможность создать просто копию базы данных под другим именем тоже иногда требуется. Xtrabackup позволяет и это сделать.

Не забываем проверить, чтобы был установлен параметр innodb_file_per_table в настройка сервера баз данных.

На сервер-источнике

создаем какталог для бэкапирования

mkdir -p /var/lib/mysql/xtradb

запускаем бэкапирование базы данных:

innobackupex --databases=sitedb /var/lib/mysql/xtradb

делаем бэкапирование структуры БД без данных

cd /var/lib/mysql/xtradb mysqldump --no-data --set-gtid-purged=off sitedb> sitedb_schema.sql

генерируем команды для переноса табличного пространства

cd /var/lib/mysql/xtradb mysql -ssre "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DISCARD TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='sitedb';"> discard_tbs.sql mysql -ssre "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' IMPORT TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='sitedb';"> import_tbs.sql

архивируем всю эту папку и переносим на сервер-назначение через scp.

На сервере-назначении

создаем какталог для разворота бэкапа

mkdir -p /var/lib/mysql/backup

разворачиваем из архива всё, что получили, в каталог /var/lib/mysql/backup
подготавливаем наш бэкап для работы

innobackupex --apply-log --export /var/lib/mysql/backup/2022-07-21/

далее самый важный пункт

обязательно проверяем, что вновь создаваемой базы не существует и каталог с ней пустой. на всякий случай удалем базу, а затем содаем новую и пустую

cd /var/lib/mysql/backup mysql -e "drop database sitedb;" mysql -e "create database sitedb;"

импортируем в неё схему

cd /var/lib/mysql/backup mysql sitedb <sitedb_schema.sql

и тут же проверяем, что всё создалось

cd /var/lib/mysql/backup mysql -e "show tables from sitedb;"

работаем с табличным пространством

cd /var/lib/mysql/backup mysql <discard_tbs.sql

Начинаем копирование с бэкапа файлов для восстановления

# копируем IBD cp /var/lib/mysql/backup/2022-07-21/sitedb/*.ibd /var/lib/mysql/sitedb/ # копируем CFG cp /var/lib/mysql/backup/2022-07-21/sitedb/*.cfg /var/lib/mysql/sitedb/ # исправлем пользователя chown -R mysql:mysql /var/lib/mysql/sitedb/

начинаем работать с табличным пространством, импортитуем его

cd /var/lib/mysql/backup mysql <import_tbs.sql

проверяем логи, что всё в порядке

less /var/log/mysql/mysql-error.log

Всё, база данных восстановлена.

Как обычно, несколько уточнений из-за которых постоянно возникают частые проблемы.

если вы используете foreign_key, то перед DISCARD необходимо установить

SET GLOBAL foreign_key_checks=0

если объем базы большой, и соединение постоянно рвется с « Can't connect to MySQL server » то необходимо установить

max_allowed_packet=256M

и перезапустить mysql