MySQL и битые таблицы
Положим, вам не повезло, и у вас побился файл таблицы mysql.users, а бэкапа нет. И repair не помогает. И войти на сервер уже нельзя. И пользователи негодуют. Как быть?
Расскажу, как мы решили подобную проблему однажды.
- Выключаем покалеченный сервер.
- Подкладываем содержимое var/mysql с любого “здорового” сервера аналогичной версии
- Запускаем сервер, и входим с логином/паролем “здорового” сервера.
Начиная с этого момента, у нас уже есть рут-доступ к серверу бд. Теперь нужно восстанавливать пользователей.
Если ваши условия схожи с нашими, то файлы у вас разложены в в определенном порядке и с определенной структурой. В нашем случае логины мы знаем зная путь к папке пользователя.
Т.е. фактически из тройки сервер-логин-пароль, два элемента мы уже знаем. Остается узнать установленные ранее пароли. И сделаем мы это просто:
find /directory -type f -exec grep ‘{sql.server.ru}’ \; >mysql.log
На выходе, в файле mysql.log мы получим список файлов, в котором встречается указанный вами адрес сервера.
После этого остается только распарсить файлы на предмет паролей, и затулить их обратно в базу данных.
Что опять же, не очень сложно, если формат пароля более-менее стандартизирован, и основные CMS известны: Joomla, WordPress, Drupal, e107, SMF, phpBB итд. Детали парсинга, если пожелает, раскроет fer0x.
Несколько часов жужжания – и 95% паролей восстановлено. Оставшиеся 5% – восстанавливать прийдется руками, по мере обнаружения не восстановленных.