文章目录
项目场景
在开发过程中,我们在 Node.js 项目中使用 MySQL 数据库,并且通过 typeorm
和 mysql
库进行数据库连接。然而,在项目启动时,遇到了数据库连接失败的问题,导致项目无法正常运行。
问题描述
在尝试初始化 MySQL 数据库连接时,出现了以下错误提示:
Database initialization Error Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
at Handshake.Sequence._packetToError (D:\ts-primevue-01\ts-primevue-01\nodets-express-api\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
...
code: 'ER_NOT_SUPPORTED_AUTH_MODE',
errno: 1251,
sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client',
sqlState: '08004',
fatal: true
错误信息说明:ER_NOT_SUPPORTED_AUTH_MODE
表示当前的 MySQL 客户端不支持 MySQL 服务器要求的身份验证协议。MySQL 8.0 及以上版本默认使用 caching_sha2_password
认证协议,但某些客户端(如 Node.js 的 mysql
库)只支持 mysql_native_password
,因此发生了兼容性问题。
原因分析
该问题的原因在于 MySQL 8.4(截至2024年的最新LTS版本)
默认的认证方式变更为 caching_sha2_password
,以提高安全性。但一些旧版本 MySQL 客户端(如 Node.js 的 mysql
库)不支持这种认证方式,只支持 mysql_native_password
,此外,MySQL 9.0
完全删除了此插件。当服务器使用的认证方式与客户端不匹配时,就会导致无法连接的问题。
在MySQL 8.0.34
到8.3
中,使用mysql_native_password
插件会导致MySQL错误日志中记录警告:
[Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
MySQL 8.4
修改为不再加载mysql_native_password
插件,是默认禁用状态,这导致了上面显示的错误。在MySQL 9.0
上,mysql_native_password
插件被完全删除,这也会导致相同的错误,下面图片是显示root
用户插件使用的是什么:
问题是Node中的mysqljs
(你用npm i mysql
安装并在Node代码中使用的包)还不支持MySQL 8的这种新的默认身份验证方法。这个问题在这里:github issue