在升级到 Ubuntu 20.04 LTS 后,MySQL 的 apt 源也更新到 MySQL 8 的版本。新的版本采用了不同的身份验证和链接方式,导致只能在 root 的 shell 中登录 MySQL。而不能使用 SSH 隧道进行远程管理。
这并非是由禁止了远程主机连接导致的,因为在 SSH 隧道建立后,管理客户端的 localhost
或 127.0.0.1
就相当于服务器本机了。经查明,这是因为 MySQL 8 默认禁用了 TCP/IP 连接的 root 登录,只能使用 UNIX Socket 文件描述符登录导致的。
本文描述了该问题的结局方法。
进行 MySQL 的初始安全配置
根据 MySQL 的官方建议,在安装完 MySQL 后,应执行 mysql_secure_installation
命令。然后,根据需要进行配置。建议在生产环境禁止匿名登录、删除测试数据库等。
1 | $ mysql_secure_installation |
第一步,我们要禁用密码强度验证插件。但是,我们应当自己对密码的复杂性负责,生产环境请谨慎关闭。
1 | VALIDATE PASSWORD COMPONENT can be used to test passwords |
第二步是设置 root 密码,虽然在之后我们会重新设置密码,但还是建议使用强密码以增强安全性。
1 | Please set the password for root here. |
第三步,需要移除匿名用户。
1 | By default, a MySQL installation has an anonymous user, |
第四步,根据需要决定是否允许 root 用户的远程登录。如果仅需要通过 SSH 隧道进行远程管理,请选择不允许。
1 | Normally, root should only be allowed to connect from |
第五步,移除测试数据库。
1 | By default, MySQL comes with a database named 'test' that |
最后,刷新权限表。
1 | Reloading the privilege tables will ensure that all changes |
修改 root 用户的登录验证插件以允许其使用 TCP/IP 协议登录
首先,以 root 用户的身份进入 MySQL 命令行。由于默认启用的 UNIX Socket 协议,我们无需知道 root 用户的密码即可登录。
1 | sudo mysql |
然后,查看 user
表的内容:
1 | use mysql; |
我们会发现 root 用户的 plugin
字段与其他用户不同,这也是其不能使用 TCP/IP 协议登录的原因。因此我们需要修改之。
1 | update user set plugin="caching_sha2_password" where User="root"; |
最后,由于验证插件改变,其密码 hash 方式也会随之变化,因此我们要重设 root 密码。请将下面的 <password>
替换为你要重新设置的 root 密码:
1 | alter user "root"@"localhost" identified by "<password>"; |
最后,重启 MySQL 服务,即可使用 TCP/IP 协议登录了。
1 | sudo service mysql restart |