Linux环境下Node.js通过ODBC连接MySQL的驱动与权限问题求助
解决MySQL ODBC连接的Access Denied问题
首先恭喜你已经搞定了驱动加载的问题!现在错误变成MySQL的权限拒绝,说明你的ODBC驱动已经能正常和MySQL服务器通信了,问题出在数据库的权限配置上,咱们一步步排查:
1. 先验证MySQL用户的连接权限
MySQL的用户权限是和用户名+来源IP绑定的,你需要确认你的数据库用户是否允许从当前服务器的IP地址连接。登录到MySQL服务器上,执行以下命令:
SELECT user, host FROM mysql.user WHERE user='你的DSN用户名';
- 如果查询结果里的
host是localhost或者某个特定IP,而你当前是从另一个IP连接的(比如你的应用服务器IP),就会触发权限拒绝。 - 解决方法:修改用户的host为
%(允许所有IP连接,注意生产环境要谨慎)或者指定你的应用服务器IP,执行:
ALTER USER '你的用户名'@'旧的host' IDENTIFIED BY '你的密码'; ALTER USER '你的用户名'@'%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;
2. 直接用MySQL命令行测试连接
先排除DSN配置里的用户名/密码错误,在你的应用服务器上执行命令行连接测试:
mysql -u 你的DSN用户名 -p'你的DSN密码' -h 你的MySQL服务器IP -P 3306 -D 你的数据库名
- 如果这个命令能成功连接,说明用户名密码没问题,问题可能出在ODBC的配置上;
- 如果这个命令也报错Access Denied,那就是数据库用户的权限或者密码确实有问题。
3. 清理重复的DSN配置
注意到你把[eFaradayDSN]的配置同时放在了/etc/odbc.ini和/etc/odbcinst.ini里,这是不符合规范的:
odbcinst.ini应该只用来配置驱动程序(比如你里面的MySQL ODBC 8.0 Unicode Driver部分);odbc.ini才是配置**数据源(DSN)**的地方。
建议你把odbcinst.ini里的[eFaradayDSN]整个段落删掉,避免配置冲突导致的异常。
4. 检查MySQL服务器的安全设置
- 确认MySQL服务器的
bind-address配置:如果my.cnf(或my.ini)里的bind-address设置为127.0.0.1,那么只允许本地连接,远程连接会被拒绝。不过你的错误是Access Denied,不是连接超时,所以这个可能性较低,但可以检查一下。 - 确认是否开启了
skip-networking:如果开启了这个选项,MySQL会禁用TCP/IP连接,也会导致无法远程连接,需要关闭。
最后再测试ODBC连接
做完以上步骤后,先测试isql命令是否能连接:
isql eFaradayDSN 你的用户名 你的密码
如果isql能成功连接,再运行你的Node.js程序,应该就能正常工作了。
内容的提问来源于stack exchange,提问作者JTInfinite




