понедельник, 14 декабря 2009 г.

Incorrect information in file: './mysql/host.frm'

После сбоя MySQL возможно повреждение служебных баз.

При старте в лог сыпится примерно следующее:

InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Starting log scan based on checkpoint at
InnoDB: log sequence number 0 49614.
InnoDB: Doing recovery: scanned up to log sequence number 0 49614
InnoDB: Started; log sequence number 0 49614
[Note] Recovering after a crash using /var/log/mysql/mysql-bin
[Note] Starting crash recovery...
[Note] Crash recovery finished.
[ERROR] /usr/sbin/mysqld: Incorrect information in file: './mysql/host.frm'
[ERROR] /usr/sbin/mysqld: Incorrect information in file: './mysql/host.frm'
[ERROR] Fatal error: Can't open and lock privilege tables: Incorrect information in file: './mysql/host.frm'



В том числе это актуально для таблиц db, func, proc, user и пр.

Если бекапов нет, то придется заново инициализировать служебные базы MySQL. Для этого первым делом сохраняем в надежно место содержимое /var/lib/mysql и /var/log/mysql на случай, если что-то пойдет не так.

К тому же данные о пользователях будут утеряны и их придется создавать заново, естественно нужно будет дать те же права и пароли, которые были ранее (ниже я приведу пример).

Итак, сохранив данные двух вышеуказанных каталогов, удаляем содержимое /var/lib/mysql/mysql/* (Обратите внимание, удалить нужно содержимое именно подкаталога mysql в каталоге /var/lib/mysql)

Инициализируем базу данных
#mysql_install_db

Вводим новый (в смысле старый пароль рута, вы же его помните ;))
dpkg-reconfigure mysql-server-5.0

запускаем MYsql
/etc/init.d/mysql start

Под рутом смотрим список баз, которые увидел мускуль
mysql -u root -p
SHOW DATABASES;

На выходе вы получите список баз.

Теперь создаем нужных пользователей и назначаем им права на базы (повторить для всех нужных пользователей и баз)

GRANT ALL ON base_name.* TO user@localhost IDENTIFIED BY "yourpassword";
base_name - имя нужной базы
user - пользователь
yourpassword - пароль на базу

На этом все. Запускайте MySQL-зависимые сервисы и наблюдайте за результатом.

ЗЫ. И делайте, в конце концов, бекапы ;)