Пересоздаем MySQL после серьезного повреждения (в т.ч. на Vesta CP). Сброс root-пароля MySQL.

Симптомы в логе MySQL такие:

[ERROR] InnoDB: Invalid redo log header checksum.
[ERROR] InnoDB: Plugin initialization aborted with error Generic error

Переходим в 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

Отправить ответ

avatar
  Subscribe  
Сообщать по почте