Восстановление mysql под Windows после сбоя по питанию.

Задача: у приятеля сервер под Windows server 8 (в Hyper-V), после сбоя он откатился до полной копии сделанной на горячем сервере. Итог, mysqld перестал запускаться ругаясь на InnoDB и предлагая почитать http://dev.mysql.com/doc/refman/5.5/en/innodb-backup.html
Плюс у него не было свежей копии баз mysql надеялся на полные резервные копии Hyper-V 🙂
И еще у него создавался один общий файл ibdata1, а хочется что бы у каждой базы были отдельные файлы.

Решение:
1. Отключаем IIS так как все равно не работают сайты, плюс нам нагрузка на mysql ненужна (я не отключал, т.к. сервер продакшен и поднимался быстро).
2. Добавляем в

C:\Program Files\MySQL\MySQL Server 5.1\my.ini
после [mysqld] строку:
innodb_force_recovery = 1

После этого мы сможем (скорее всего) запустить mysqld (если сервер работает, то мы можем выполнять всякие запросы select, менять в базе чего то не советую), иначе (не повезло) читаем ссылку выше.
3. Делаем резервное копирование всех баз (может быть вам надо добавить еще ключей):

mysqldump -u root -p --add-drop-table --add-drop-database --all-databases > "C:\backup\all-dump.sql"

4. Теперь нам нужно запустить еще одну копию mysqld для этого копируем папку

"C:\Program Files\MySQL\MySQL Server 5.1"

(ну или куда там установлено) в (например)

"C:\Program Files\MySQL\MySQL Server 5.1 - копия"

Теперь смотрим в

"C:\Program Files\MySQL\MySQL Server 5.1\my.ini"

где располагаются файлы базы, строка

datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data/"

Теперь создаем папку под новую базу

"C:/ProgramData/MySQL/MySQL Server 5.1/Data1/"

Останавливаем mysqld и копируем папку

"C:/ProgramData/MySQL/MySQL Server 5.1/Data/mysql"

в папку

"C:/ProgramData/MySQL/MySQL Server 5.1/Data1/mysql"

и запускаем сервер mysqld обратно. меняем в файле

"C:\Program Files\MySQL\MySQL Server 5.1 - копия\my.ini"

строки:

[client]
port=3306

[mysqld]
innodb_force_recovery = 1
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data/"

Меняем на:

[client]
port=3307
[mysqld]
#Отдельный файл для каждой таблицы
innodb_data_file_path=ibdata1:10M:autoextend
innodb_file_per_table=1
#innodb_force_recovery = 1
# The TCP/IP Port the MySQL Server will listen on
port=3307
#Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/Program Files/MySQL/MySQL Server 5.1 - копия/"
#Path to the database root
datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data1/"

То есть заменяем порт на котором работает сервер и рабочие папки программы и базы.
Все мы готовы создать службу для нового mysqld, для этого:

"C:/Program Files/MySQL/MySQL Server 5.1 - копия/bin/mysqld" --install-manual MySQLrrv  --defaults-file="C:/Program Files/MySQL/MySQL Server 5.1 - копия/my.ini"

Получаем службу MySQLrrv с ручным запуском. Все заходим в службы и запускаем.
4. Если все ок заливаем подготовленный dump

"C:\Program Files\MySQL\MySQL Server 5.1 - копия\bin\mysql.exe" -P 3307 -u root -p < C:\backup\all-dump.sql

5. Останавливаем обе службы mysql и меняем восстановленную базу на место испорченной, то есть переименовываем

"C:/ProgramData/MySQL/MySQL Server 5.1/Data/"

в

"C:/ProgramData/MySQL/MySQL Server 5.1/Data.bed/"

а

"C:/ProgramData/MySQL/MySQL Server 5.1/Data1/"

в

"C:/ProgramData/MySQL/MySQL Server 5.1/Data/"

6. Приводим

"C:\Program Files\MySQL\MySQL Server 5.1\my.ini"

в конечное (правильное) состояние меняя:

[mysqld]
innodb_force_recovery = 1

на

[mysqld]
#innodb_force_recovery = 1
innodb_data_file_path=ibdata1:10M:autoextend
innodb_file_per_table=1

7. И запускаем mysqld службу. Все имеем рабочую систему. 🙂

P.S. Можно удалить созданную нами службу MySQLrrv

"C:/Program Files/MySQL/MySQL Server 5.1 - копия/bin/mysqld" --remove MySQLrrv

и созданные не нужные каталоги, хотя я все оставил на будущее, просто запретил ручками запуск службы MySQLrrv.
Кстати так можно безопасно и переезжать на новую версию mysql.

Leave a Reply