Восстановление корневого доступа к серверу MySQL на Ubuntu

Я пытаюсь восстановить root-доступ к базе данных MySQL, запущенной на экземпляре Ubuntu (LTS 16.04.2). Проблемная ситуация: я могу запустить и остановить MySQL с помощью /etc/init.d/mysql, но я не могу войти в систему ни с одним из

mysql -u root mysql -u root -p

. Последний с пустым паролем. У меня есть пустая запись в моем хранилище паролей. Я верю, что помню, что логин был возможен без пароля, но, возможно, я просто забыл сохранить свой магазин паролей должным образом. Возможно, и система скомпрометирована. Однако, поскольку у меня есть root-доступ, у меня есть возможность сбросить пароль.

Я решил запустить MySQL-сервер с помощью команды

sudo -u mysql /usr/sbin/mysqld --skip-grant-tables --skip-networking

и теперь можно подключиться к клиенту. В соответствии с учебным пособием я должен задать две команды

FLUSH PRIVILEGES; SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');

, чтобы установить пароль. Выдавая вторую команду, я получаю следующее предупреждение на консоли, где я запустил сервер:

[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored.

Я не помню, чтобы когда-либо настраивал плагин. Это Ubuntu по умолчанию? Где мой пароль MySQL хранится тогда и как его изменить? Или как отключить этот плагин, о котором я не знаю.

0
задан 31 May 2017 в 10:05

4 ответа

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');

... является неправильной командой. В 2015 году этот столбец был устаревшим и заменен столбцом «authentication_string».

Он должен быть

UPDATE user SET authentication_string=PASSWORD('MyNewPass') where USER='root';
1
ответ дан 18 July 2018 в 12:26

Что вам нужно сделать после того, как вы разделите skip-grant-tables, подключитесь к своей базе данных и используйте базу данных mysql.

Таким образом, это будет:

sudo systemctl stop mysql.service sudo mysqld_safe --skip-grant-tables --skip-networking & mysql -u root use mysql; FLUSH PRIVILEGES; UPDATE user SET authentication_string = PASSWORD('newpass') WHERE User = 'root' AND Host = 'localhost'; \q sudo killall mysqld sudo systemctl start mysql.service
1
ответ дан 18 July 2018 в 12:26
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');

... является неправильной командой. В 2015 году этот столбец был устаревшим и заменен столбцом «authentication_string».

Он должен быть

UPDATE user SET authentication_string=PASSWORD('MyNewPass') where USER='root';
1
ответ дан 24 July 2018 в 19:57

Что вам нужно сделать после того, как вы разделите skip-grant-tables, подключитесь к своей базе данных и используйте базу данных mysql.

Таким образом, это будет:

sudo systemctl stop mysql.service sudo mysqld_safe --skip-grant-tables --skip-networking & mysql -u root use mysql; FLUSH PRIVILEGES; UPDATE user SET authentication_string = PASSWORD('newpass') WHERE User = 'root' AND Host = 'localhost'; \q sudo killall mysqld sudo systemctl start mysql.service
1
ответ дан 24 July 2018 в 19:57
  • 1
    Я попробовал это. Он работал без ошибок, но после Access denied for user 'root'@'localhost' при попытке войти в систему с только что установленным паролем остается. – Paramaeleon 17 July 2017 в 13:09

Другие вопросы по тегам:

Похожие вопросы: