Симптомы в логе MySQL такие:
[ERROR] InnoDB: Invalid redo log header checksum. [ERROR] InnoDB: Plugin initialization aborted with error Generic error
Способ 1: быстро и должно помочь
Основано на [5].
Делаем бекап (apt-btrfs-snapshot snapshot
).
В /etc/mysql/my.cnf
поставить innodb_force_recovery = 6
systemctl restart mysql
mysqldump -AER > /root/recovery_dump.sql systemctl stop mysql mkdir -p /root/mysql-ibd-bak/ mv /var/lib/mysql/ibdata* /root/mysql-ibd-bak/ mv /var/lib/mysql/ib_log* /root/mysql-ibd-bak/
В /etc/mysql/my.cnf
закомментировать innodb_force_recovery = 6
, systemctl restart mysql
После этого заработало.
mysql < /root/recovery_dump.sql
не понадобилось, оно просто ругнулось на уже существующую БД.
Способ 2: хардкор, ничего не помогает
Переходим в root-режим: sudo -i
или su -
. Все дальнейшие действия выполняютсмя от root.
Вносим в конфиг MySQL (/etc/mysql/my.cnf
на Ubuntu и /etc/my.cnf
на CentOS) строку:
innodb_force_recovery = 6
Перезапускаем MySQL: systemctl restart mysql
. Он должен запуститься, но базы данных буду в режиме только чтения.
Снимаем дампы или просто удаляем поврежденные базы, если это тестовые.
Просто удалить все базы будет мало для полного восстановления, поэтому удаляем вообще все (убедитесь, что есть рабочие бекапы! рекомендую снапшоты BTRFS), сначала остановив MySQL:
systemctl stop mysql
rm -fvr /var/lib/mysql/*
Делаем заново начальную инициализацию:
mysqld --initialize
И перезапускаем MySQL:
systemctl restart mysql
Убеждаемся, что он запустился! (systemctl status mysql
)
Останаливаем MySQL:
systemctl stop mysql
Теперь нужно установить новый root-пароль внутри MySQL.
Запустим MySQL в безопасном режиме, чтобы он позволил нам войти в управлением им без знания root-пароля:
mkdir /var/run/mysql chown -R mysql:mysql /var/run/mysql mysqld_safe --skip-grant-tables --skip-networking &
(нажимаем клавишу Enter несколько раз, если нет запроса командной строки)
Вы должны увидеть сообщение, свидетельствующее об успешном запуске:
2018-07-31T20:38:44.962048Z mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
Создаем новый рандомный root-пароль:
pass="$(cat /dev/urandom | head -n 2 | md5sum | awk '{print $1}')"
Выводим этот новый пароль, копируем его в буфер обмена для дальнейшей вставки:
echo "$pass"
Далее входим в консоль MySQL и выполняем установку нового root-пароля:
# mysql -u root > use mysql; > update user set authentication_string=password('вставить_новый_пароль') where user='root'; > flush privileges; > quit;
# mysql -u root > FLUSH PRIVILEGES; > ALTER USER 'root'@'localhost' IDENTIFIED BY 'вставить_новый_пароль'; > exit
Убиваем запущенный в безопасном режиме MySQL:
pkill mysqld
Далее, если используется панель управления Vesta, то нам нужно в ее конфиги записать новый пароль от MySQL, чтобы не было ошибки "Error: Connection to localhost failed" при попытке управлять базами данных через Vesta. Для этого нужно заменить старый пароль на новый путем редактировавания в обычном текстовом редакторе двух файлов: /root/.my.cnf
и /usr/local/vesta/conf/mysql.conf
.
Теперь запускаем MySQL:
systemctl restart mysql
Командой systemctl status mysql
убеждаемся, что он запустился:
Теперь пробуем в Vesta создать новую базу данных и убеждаемся, что это получилось сделать.
Источники и прочие полезные ссылки:
[1] https://www.techrepublic.com/article/how-to-set-change-and-recover-a-mysql-root-password/
[2] https://forum.vestacp.com/viewtopic.php?p=69952#p69952
[3] http://www.mysql.ru/docs/man/Resetting_permissions.html
[4] https://bugs.mysql.com/bug.php?id=84191
[5] https://forums.cpanel.net/resources/innodb-corruption-repair-guide.395/
Отправить ответ