ASP.NET Core MVC应用MySqlClient以请求端IP认证MySQL失败问题排查
排查解决步骤
- 第一步:验证程序实际读取的连接字符串是否正确
这类问题绝大多数根源都是部署后配置未正确加载,在创建MySqlConnection的代码前添加日志输出,打印你拿到的connectionString实际值,确认和你预期的配置完全一致。
常见配置加载失败原因包括:- 发布时
appsettings.json等配置文件未被复制到部署目录 - Linux服务器下程序运行用户对配置文件没有读取权限
- ASP.NET Core配置优先级导致连接字符串被覆盖:环境变量、命令行参数的优先级高于配置文件,检查服务器上是否存在同名的环境变量冲掉了你的连接字符串配置
- 发布时
- 第二步:修复静态数据库连接的错误用法
你当前定义了private static MySqlConnection dbConnection静态连接对象,在ASP.NET Core多请求并发的场景下,静态连接会被多个请求共享篡改,极易出现连接状态混乱、参数被覆盖的问题,这也是你当前出现空凭证连接错误的高概率原因。
正确用法是不要用静态连接,每次需要操作数据库时创建新的MySqlConnection对象,用完立即释放,或者通过ASP.NET Core依赖注入注册Scoped生命周期的数据库连接,每个请求独立使用一个连接。 - 第三步:验证MySQL用户权限配置
登录服务器上的MySQL服务,执行以下SQL确认你连接字符串中使用的用户允许从127.0.0.1登录:
如果对应账号的host不是SELECT user,host FROM mysql.user WHERE user='你的实际用户名';127.0.0.1也不是通配符%,需要执行授权语句:GRANT ALL PRIVILEGES ON somedb.* TO 'someuser'@'127.0.0.1' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES; - 第四步:更换MySQL连接驱动
Oracle官方的MySql.Data库对.NET Core和Linux环境的兼容性较差,存在很多已知的连接异常问题,建议替换为社区维护的MySqlConnector库,二者API几乎完全兼容,只需替换NuGet包,将命名空间改为using MySqlConnector;即可,大部分同类异常更换驱动后都能解决。 - 第五步:检查系统安全策略
可临时关闭Ubuntu的AppArmor服务测试是否是安全策略限制导致的异常,命令如下:
测试后记得重新开启服务。systemctl stop apparmor
内容的提问来源于stack exchange,提问作者user16027534
相关产品推荐
相关产品推荐

