解决RubyMine无法连接MySQL 8 (caching_sha2_password)
2025-03-25 07:56:44
RubyMine 无法通过 caching_sha2_password 连接到 MySQL 8:问题排查与解决
在使用 RubyMine 连接 MySQL 8 数据库,且用户认证方式为 caching_sha2_password
时,可能会遇到连接失败的问题。 这是因为 RubyMine (或其他一些客户端) 可能还依赖于较旧的、已被弃用的 mysql_native_password
认证插件。 这篇帖子就来聊聊如何解决这个问题, 以及如何确定 MySQL 用户的认证方式。
一、 问题原因: 认证插件的变迁
MySQL 8 引入了 caching_sha2_password
作为默认的身份验证插件,它比之前版本默认使用的 mysql_native_password
更加安全。 问题就出在这里:较老的客户端,包括一些版本的 RubyMine 使用的数据库连接库,可能尚未完全支持 caching_sha2_password
,还尝试使用 mysql_native_password
进行连接。 结果自然是连不上。
此外,如果服务器端完全禁用了mysql_native_password
, 那么这种不兼容将导致连接必然失败。
要搞清楚当前用户的认证方式,可以通过如下的SQL查询来实现:
SELECT user, host, plugin FROM mysql.user;
这个查询语句会列出所有的MySQL用户,包括他们对应的 host
以及当前使用的 plugin
(也就是身份验证插件)。 从这个列表里,我们就能轻松识别出谁在用caching_sha2_password
,谁在用 mysql_native_password
。 假设我们创建了如下两个用户:
CREATE USER IF NOT EXISTS 'rachel' IDENTIFIED WITH mysql_native_password BY 'super_secure_password';
CREATE USER IF NOT EXISTS 'bob' IDENTIFIED WITH caching_sha2_password BY 'amazing_password';
执行以上SELECT
语句,就能从plugin
列看到他们的认证插件差异。
二、 解决方法
针对这个问题,有几种不同的解决方案,可以根据具体情况选择:
1. 更改用户认证插件 (推荐)
这是最直接的方法。 把用户的认证插件改成 mysql_native_password
,这样客户端就能用它习惯的方式连接了。但请注意,这个方式相对来说安全性较低,所以尽量只作为临时解决方案,或在确定客户端都支持 caching_sha2_password
的内部开发环境使用 。
操作步骤:
-
使用管理员权限登录 MySQL:
mysql -u root -p
-
更改指定用户的认证插件:
将下面命令中的
'bob'
替换成实际用户名,'amazing_password'
替换成用户的实际密码:ALTER USER 'bob'@'localhost' IDENTIFIED WITH mysql_native_password BY 'amazing_password';
'bob'@'localhost'
: 指定要修改的用户和主机。localhost
表示只允许从本地连接。 如果需要从其他主机连接,请将localhost
替换为相应的主机名或 IP 地址,或者使用%
允许所有主机。IDENTIFIED WITH mysql_native_password
:指定使用mysql_native_password
插件。BY 'amazing_password'
:设置用户密码,请确保使用安全的密码。
-
刷新权限:
FLUSH PRIVILEGES;
-
重连测试。
2. 升级 RubyMine 的 JDBC 驱动
较新版本的 JDBC 驱动通常已经支持 caching_sha2_password
。 如果有新版本可用,更新驱动可能就能直接解决问题。
操作步骤:
-
打开 RubyMine 的数据库配置窗口: 找到连接失败的那个数据库配置。
-
找到 Driver 选项: 一般会有一个下拉框,可以选择不同的驱动版本。
-
尝试选择最新的 MySQL Connector/J 版本: 通常可以直接在列表中找到。 如果找不到,可能需要手动下载。
-
手动下载并添加 (如果需要):
- 去 MySQL 官网下载 Connector/J 的最新版 (JAR 文件)。
- 在 RubyMine 的驱动设置里,找到 “Add Custom JARs” 或类似的选项,把下载的 JAR 文件添加进去。
- 然后在驱动版本列表中选择你添加的JAR包。
-
重新测试连接。
3. 在连接 URL 中指定认证插件 (不完全可靠)
有些情况下,可以在数据库连接的 URL 里添加参数,强制使用 caching_sha2_password
。这种方法的可靠性取决于驱动的具体实现,不一定所有情况下都有效。
操作步骤:
-
打开 RubyMine 的数据库配置窗口。
-
找到连接 URL (JDBC URL): 通常会是一个类似
jdbc:mysql://localhost:3306/your_database
的字符串。 -
在 URL 中添加参数:
- 对于
caching_sha2_password
, 可以试试加上?defaultAuthenticationPlugin=caching_sha2_password
。
完整URL类似:jdbc:mysql://localhost:3306/your_database?defaultAuthenticationPlugin=caching_sha2_password
。 - 对于有些驱动版本或老版本服务器强制使用
mysql_native_password
的情况, 可以试试加上?defaultAuthenticationPlugin=mysql_native_password&useSSL=false
。
- 对于
-
保存配置并测试连接。
4. MySQL 服务器端调整 (可选,非必须)
这种方法针对的是客户端支持 caching_sha2_password
, 但默认发送 mysql_native_password
连接请求导致首次认证失败的情况。通过在服务器端启用兼容选项,可以让服务器在遇到旧的mysql_native_password
初始请求后,允许客户端通过发送 caching_sha2_password
格式的密码继续进行验证,而不需要修改客户端配置或者用户本身的身份验证插件。
操作步骤(以 Linux 系统为例,修改 MySQL 配置文件):
-
编辑 MySQL 配置文件:
通常位于/etc/mysql/my.cnf
或/etc/mysql/mysql.conf.d/mysqld.cnf
。使用root权限或sudo编辑. -
在
[mysqld]
部分添加配置:
添加或修改default_authentication_plugin
,以及可能需要的caching_sha2_password_auto_generate_rsa_keys
、get_server_public_key
:[mysqld] default_authentication_plugin=caching_sha2_password caching_sha2_password_auto_generate_rsa_keys=ON # 自动生成RSA密钥对
get_server_public_key
选项的开启方式跟具体的mysql connector 和 驱动版本强相关,可能需要自行测试决定. 一般客户端没有显式设置此选项。 -
针对8.0.18以前版本 : 老版本, 例如 MySQL 8.0.4 到8.0.11 的某些早期版本,行为有所不同,需要手动生成 RSA 密钥对。生成和配置密钥的过程需要特别注意:
- 使用
openssl
生成公私钥,配置目录通常为/var/lib/mysql
下
sudo openssl genrsa -out /var/lib/mysql/private_key.pem 2048 sudo openssl rsa -in /var/lib/mysql/private_key.pem -pubout -out /var/lib/mysql/public_key.pem sudo chown mysql:mysql /var/lib/mysql/private_key.pem sudo chown mysql:mysql /var/lib/mysql/public_key.pem sudo chmod 600 /var/lib/mysql/private_key.pem sudo chmod 644 /var/lib/mysql/public_key.pem
然后在配置文件中明确指定:
[mysqld] default_authentication_plugin=caching_sha2_password caching_sha2_password_private_key_path=/var/lib/mysql/private_key.pem caching_sha2_password_public_key_path=/var/lib/mysql/public_key.pem
- 使用
-
重启 MySQL 服务:
使得更改的配置生效:sudo systemctl restart mysql
或者
sudo service mysql restart
-
客户端侧测试
重启 MySQL 服务之后,使用RubyMine或任何其他的数据库客户端测试与服务器之间的连接。
安全性建议:
- 密钥文件保护: 无论自动生成还是手动生成,保证密钥文件的安全至关重要。确保只有MySQL服务用户具有对密钥文件的访问权限。
- 客户端连接 : 如果配置了
caching_sha2_password
并且环境允许,应强制使用安全连接(SSL/TLS)。
5. 使用 SSH 隧道 (适用于远程连接)
如果 RubyMine 位于远程机器, 可以通过 SSH 隧道建立一个安全的连接, 将本地端口转发到 MySQL 服务器,然后使用 RubyMine 的本地连接方式连接到 MySQL 数据库,规避认证插件的问题。
操作步骤
-
建立 SSH 隧道:
在本地计算机上执行如下命令:ssh -L 3307:localhost:3306 user@mysql_server_ip -N
-L 3307:localhost:3306
: 将本地的3307
端口转发到mysql_server_ip
上的localhost:3306
(即 MySQL 服务器)。user
:在 MySQL 服务器上的用户名。mysql_server_ip
: MySQL服务器IP地址。-N
: 表示仅做转发,不需要打开远程 shell。
-
** RubyMine 中使用本地连接:**
在 RubyMine 的数据库配置中:- Host :
localhost
或者127.0.0.1
。 - Port :
3307
(上一步指定的本地端口). - User/Password : 输入你的 MySQL 数据库用户和密码。
- 认证方式 : 这时候可以选择任意 RubyMine 支持的,因为实际的数据传输被安全的封装在了 SSH 隧道中。
- Host :
-
保持 SSH 隧道开启: 连接成功后, 需要一直保持这个 SSH 命令运行, 这样本地端口
3307
才持续被转发到数据库服务.
安全性提醒
- 使用 SSH 隧道可以保护数据传输过程,确保了连接的安全性。
- 如果要通过非安全网络 (如公网) 连接到 MySQL,强烈建议使用这种方式。
总结
根据不同的场景和需求,上面提到的5种方法能处理多数RubyMine 连接 MySQL 的问题。总的来说,推荐优先升级 JDBC 驱动或建立SSH隧道;如果只是用于临时开发测试,则可暂时修改认证插件,等客户端驱动跟上后及时改回。