Я пытаюсь восстановить 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 хранится тогда и как его изменить? Или как отключить этот плагин, о котором я не знаю.
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');
... является неправильной командой. В 2015 году этот столбец был устаревшим и заменен столбцом «authentication_string».
Он должен быть
UPDATE user SET authentication_string=PASSWORD('MyNewPass') where USER='root';
Что вам нужно сделать после того, как вы разделите 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
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');
... является неправильной командой. В 2015 году этот столбец был устаревшим и заменен столбцом «authentication_string».
Он должен быть
UPDATE user SET authentication_string=PASSWORD('MyNewPass') where USER='root';
Что вам нужно сделать после того, как вы разделите 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