Ну вот я и собрался опубликовать очередную статью. Примерно 1,5 месяца был перерыв — работы было много, но это даже хорошо за это время накопился небольшой опыт, будет чем поделится с читателями блога.
Сегодня статья будет посвящена теме восстановление MySQL. С этим вопросом я столкнулся в июне, когда на нашем сервере разработки для Drupal сайтов (он находится на виртуалке) в следствии жесткого рестарта сломался MySQL, а бэкап виртуалки был примерно на 10 дней назад, что оказалось неприемлемо для нескольких баз данных. Да, да, да всем известный вопрос о бэкапировании коснулся и нас.
Введение в проблему
В один прекрасный день стали появляться ошибки PHP при обращении к MySQL типа: MySQL has gone away. Большинство сайтов на сервере разработки перестали работать.
Подключившись к серверу MySQL увидел, что после команды 'use database' mysql перестает выполнять какие либо запросы.
Мы приняли решение: взять бэкап сервера 10 дневной давности и попробовать восстановить в него 3 базы данных из "испорченного" сервера mysql.
Восстановление
В сети нашел понятную инструкцию по восстановлению MySQL и начал выполнять вариант 2 по шагам.
К сожалению, на шаге "сохранения всех данных"
mysqldump --force --compress --triggers --routines --create-options -uUSERNAME -pPASSWORD --all-databases > /usr/alldb.sql
у меня случился "fail". А именно mysqldump стал показывать ошибку: Lost connection to MySQL server during query when dumping table
Также я попробовал сделать mysqldump только для нужных мне баз данных, но ошибки повторились.
После этого я поступил следующим образом:
- Используя MySQL Workbench сделал бэкап нужных мне баз данных. Этот инструмент делает бэкап по-таблично, то есть каждая таблица в отдельном файле (mysqldump почему-то при выполнении подобных команд показывал ошибки). На этом шаге я увидел что таблицы 'cache*' были повреждены и их бэкап не удалось сделать.
- Восстановил все базы 10 дневной давности.
- Написал небольшой скрипт импорта всех файлов дампов таблиц из текущего каталога в базу данных
#!/bin/bash #Создаем список всех файлов с маской mydatabase_* LIST=$(ls -rt mydatabase_*) #перебираем все элементы списка for i in $LIST; do echo "mysql -uUSER -pPASSWORD --default-character-set=utf8 mydatabase < "$i mysql -uUSER -pPASSWORD --default-character-set=utf8 mydatabase < $i done
- Я запустил этот скрипт для нескольких баз данных, бэкап таблиц которых удалось сделать
P.S. Ну и конечно же следующая статья будет посвящена настройке сервера бэкапов;)