在 Ubuntu 上重新获得 MySQL 服务器的 root 访问权限

在 Ubuntu 上重新获得 MySQL 服务器的 root 访问权限

我正在尝试重新获得在 Ubuntu 实例 (LTS 16.04.2) 上运行的 MySQL 数据库的 root 访问权限。问题情况是:我可以使用启动和停止 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 密码存储在哪里?我该如何更改它?或者我该如何禁用我不知道的插件。

答案1

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

... 是错误的命令。2015 年,该列被弃用,并由“authentication_string”列取代。

它应该是

UPDATE user SET authentication_string=PASSWORD('MyNewPass') where USER='root'; 

答案2

跳过授权表后您需要做的是连接到数据库并使用 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

答案3

您仍然需要使用 sudo mysql -u root -p 以新凭据登录(除非您更改 root 用户的插件类型...)

相关内容