Задача: у приятеля сервер под 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.sql5. Останавливаем обе службы 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=17. И запускаем mysqld службу. Все имеем рабочую систему. 🙂
P.S. Можно удалить созданную нами службу MySQLrrv
"C:/Program Files/MySQL/MySQL Server 5.1 - копия/bin/mysqld" --remove MySQLrrvи созданные не нужные каталоги, хотя я все оставил на будущее, просто запретил ручками запуск службы MySQLrrv.
Кстати так можно безопасно и переезжать на новую версию mysql.