Не всегда восстановление базы данных происходит на новом сервере, как было описано в 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