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

Симптомы в логе 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/

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

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