解决 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
mysql_secure_installation

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

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

1
sudo mysql

然后,查看 user 表的内容:

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

我们会发现 root 用户的 plugin 字段是 auth_socket,也就是使用本地 UNIX Socket 进行认证。如果不需要,可以直接卸载这个认证方式的插件。

1
2
UNINSTALL PLUGIN auth_socket;
flush privileges;

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

1
2
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '你的密码';
flush privileges;

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

1
$ sudo service mysql restart