Каждый человек, который делает бэкапы каких-либо приложений (при копировании чего-либо отличного от обычных файлов) должен знать и понимать, что бэкап — это только половина дела по обеспечению надежности функционирования и защищенности данных сервиса от потери. Вторая, не менее важная, половина — это умение этот бэкап восстановить. По-хорошему, бэкапы надо регулярно восстанавливать в «тестовых» условиях, так сказать, проводить учения :) Чтобы при возникновении необходимости восстановления, не было вопросов типа «а что с этим делать?».
В случае с MyISAM-таблицами все обстоит совсем просто. Если сделать «flush tables with read lock», то их можно даже скопировать на файловом уровне. Хоть официально это и не поддерживается, но чаще всего работает «на ура». С InnoDB-таблицами все намного сложнее…
Для восстановления нам понадобится mysql-сервер той же версии, как и на «боевом» сервере. Если бэкапы делались при помощи снэпшотов и они еще не удалены с сервера, то на «боевом» сервере их восстановить будет даже проще — локально скопировать несколько файлов куда проще, чем доставать из архива и копировать по сети. Итак, для восстановления базы из горячего бэкапа в случае InnoDB-таблиц нам понадобится:
1) Копируем файл конфигурации с рабочего варианта (/etc/my.cnf в /etc/my2.cnf) и заменяем в нем: порт, который слушает mysql (3306) на любой другой (3307, например); сокет, который слушает mysql (/tmp/mysql.sock на /tmp/mysql2.sock); pid-файл (mysql.pid на mysql2.pid); директорию с файлами БД (/var/db/mysql на /var/db/mysql2).
2) Копируем в /var/db/mysql2 файлы из корня бэкапа (т.е. ib_logfile0, ib_logfile1 и др). Копируем из бэкапа директории performance_schema и mysql, а также директорию с базой данных, которую мы хотим восстановить.
3) Проверяем права на директорию /var/db/mysql2. Они должны быть такими же, как и на директорию /var/db/mysql.
4) Запускаем вторую копию mysql командой:
mysqld_safe --defaults-file=/etc/my2.cnf &
5) Запускаем mysqldump с необходимыми ключами (набор которых зависит от размера БД, количества памяти на сервере и т.д.). Если вы не знаете, какие ключи вам нужны, можете запускать его совсем без ключей. Главное — указать сокет:
mysqldump -S /tmp/mysql2.sock database_to_dump > /path/to/save/dump
6) Если дамп прошел успешно — гасим вторую копию mysql командой:
mysqladmin -S /tmp/mysql2.sock shutdown
После всего этого у нас будет дамп базы данных на руках. А с ним уже можно делать все, что душе угодно :)