====== Percona XtraBackup: Бэкап и создание отдельной базы ======
Не всегда восстановление базы данных происходит на новом сервере, как было описано в [[:db:backup_database_only|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
и тут же проверяем, что всё создалось
cd /var/lib/mysql/backup
mysql -e "show tables from sitedb;"
работаем с табличным пространством
cd /var/lib/mysql/backup
mysql
Начинаем копирование с бэкапа файлов для восстановления
# копируем 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
проверяем логи, что всё в порядке
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