====== Percona XtraBackup: Бэкап отдельной таблицы или базы ====== Не всегда нужны архивные копии всего mysql сервера. Иногда достаточно отдельной базы данных или даже таблицы. Xtrabackup позволяет это сделать на отдельном сервере. Не забываем проверить, чтобы был установлен параметр **innodb_file_per_table** в настройка сервера баз данных. Архивируем только одну базу данных site. xtrabackup --backup --databases "site" --target-dir=/root/backupdb/site Восстановление отдельной базы mysql будет выглядеть так. xtrabackup --prepare --databases "site" --target-dir=/root/backupdb/site systemctl stop mysqld mkdir -p /var/lib/mysql.old/site mv /var/lib/mysql/site /var/lib/mysql.old mv /root/backupdb/site/site /var/lib/mysql chown -R mysql. /var/lib/mysql systemctl start mysql Мы по сути просто скопировали исходные файлы базы из бэкапа в рабочий каталог, предварительно сохранив предыдущую версию базы на всякий случай. Теперь попробуем из полного бэкапа базы восстановить только одну таблицу. В примере на работающем сервере делается восстановление существующей таблицы из полного бэкапа. Если будете восстанавливать на другой сервер, то перед этим вам нужно будет воссоздать исходную структуру таблицы перед тем, как будете восстанавливать данные по предложенному методу. Готовим бэкап к восстановлению: xtrabackup --prepare --export --target-dir=/root/backupdb/full Идем в консоль mysql и выбираем там таблицу для восстановления. В примере это будет таблица **b_user_access** из базы site. Смотрим, заполнена ли таблица данными. mysql> SELECT COUNT(*) FROM site.b_user_access; +----------+ | COUNT(*) | +----------+ | 6 | +----------+ 1 row in set (0.00 sec) Делаем **DISCARD** этой таблицы. mysql> ALTER TABLE site.b_user_access DISCARD TABLESPACE; Query OK, 0 rows affected (0.00 sec) Discard означает, что будет удален **ibd** файл таблицы. Теперь нам его нужно скопировать из бэкапа и назначить права для mysql. cp /root/backupdb/full/site/b_user_access.* /var/lib/mysql/site chown mysql. /var/lib/mysql/site/b_user_access.* Возвращаемся в консоль mysql и импортируем данные. mysql> ALTER TABLE site.b_user_access IMPORT TABLESPACE; Query OK, 0 rows affected (0.03 sec) Смотрим, что получилось. mysql > SELECT COUNT(*) FROM site.b_user_access; +----------+ | COUNT(*) | +----------+ | 6 | +----------+ 1 row in set (0.00 sec) Данные восстановлены.