解决 MySQL 8 无法使用 TCP/IP 协议登录 root 用户的问题

在升级到 Ubuntu 20.04 LTS 后,MySQL 的 apt 源也更新到 MySQL 8 的版本。新的版本采用了不同的身份验证和链接方式,导致只能在 root 的 shell 中登录 MySQL。而不能使用 SSH 隧道进行远程管理。

这并非是由禁止了远程主机连接导致的,因为在 SSH 隧道建立后,管理客户端的 localhost127.0.0.1 就相当于服务器本机了。经查明,这是因为 MySQL 8 默认禁用了 TCP/IP 连接的 root 登录,只能使用 UNIX Socket 文件描述符登录导致的。

本文描述了该问题的结局方法。

进行 MySQL 的初始安全配置

根据 MySQL 的官方建议,在安装完 MySQL 后,应执行 mysql_secure_installation 命令。然后,根据需要进行配置。建议在生产环境禁止匿名登录、删除测试数据库等。

1
2
3
$ mysql_secure_installation
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.

第一步,我们要禁用密码强度验证插件。但是,我们应当自己对密码的复杂性负责,生产环境请谨慎关闭。

1
2
3
4
5
6
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: n

第二步是设置 root 密码,虽然在之后我们会重新设置密码,但还是建议使用强密码以增强安全性。

1
2
3
4
Please set the password for root here.

New password:
Re-enter new password:

第三步,需要移除匿名用户。

1
2
3
4
5
6
7
8
9
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

第四步,根据需要决定是否允许 root 用户的远程登录。如果仅需要通过 SSH 隧道进行远程管理,请选择不允许

1
2
3
4
5
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : n

第五步,移除测试数据库。

1
2
3
4
5
6
7
8
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.

最后,刷新权限表。

1
2
3
4
5
6
7
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

修改 root 用户的登录验证插件以允许其使用 TCP/IP 协议登录

首先,以 root 用户的身份进入 MySQL 命令行。由于默认启用的 UNIX Socket 协议,我们无需知道 root 用户的密码即可登录。

1
$ sudo mysql

然后,查看 user 表的内容:

1
2
use mysql;
select Host, User, plugin from user;

我们会发现 root 用户的 plugin 字段与其他用户不同,这也是其不能使用 TCP/IP 协议登录的原因。因此我们需要修改之。

1
update user set plugin="caching_sha2_password" where User="root";

最后,由于验证插件改变,其密码 hash 方式也会随之变化,因此我们要重设 root 密码。请将下面的 <password> 替换为你要重新设置的 root 密码:

1
2
alter user "root"@"localhost" identified by "<password>";
flush privileges;

最后,重启 MySQL 服务,即可使用 TCP/IP 协议登录了。

1
$ sudo service mysql restart

分享文章

链接
HTML
Markdown