Authentication to host ‘127.0.0.1‘ for user ‘root‘ using method ‘caching_sha2_password‘ failed with

发布时间:2026/7/4 5:17:28

Authentication to host ‘127.0.0.1‘ for user ‘root‘ using method ‘caching_sha2_password‘ failed with 记一次MySQL跨地域连接“握手超时”的完整解决实录一次真实的跨地域部署踩坑记录从问题定位到完美解决。1. 问题诞生一次寻常的部署与不寻常的报错最近将内部系统进行跨地域部署架构很简单.NET 8开发的API应用放在本地的Windows Server上MySQL 8.0.4数据库则运行在远程数据中心。部署完成后一个诡异的现象出现了✅ 不涉及数据库的API端点如登录获取Token完全正常❌ 但凡涉及数据库查询的接口全部返回同样的错误Got timeout reading communication packets控制台中的完整错误信息更是耐人寻味Authentication to host 127.0.0.1 for user root using method caching_sha2_password failed with message: got timeout reading communication packets (错误代码1159)这提示我们连接能建立但在认证阶段卡住了。2. 问题排查从基础测试到系统化验证第一步基础网络诊断首先在应用服务器上检查到远程数据库的基础连通性# 使用PowerShell测试端口连通性Test-NetConnection-ComputerName 127.0.0.1-Port 3306结果出乎意料端口是开放的TCP连接可以建立。这说明不是防火墙或网络不通的基础问题。第二步编写系统化测试程序为了全面诊断问题我编写了一个能同时测试多种连接策略的程序。这个程序的价值在于它能并行验证不同的解决方案帮助我们快速找到最优解。usingMySql.Data.MySqlClient;classTestDbConnection{staticvoidMain(){// 尝试不同的连接字符串string[]connectionStrings{// 方案1: 使用旧认证方式Server127.0.0.1;Port3306;Databasedb;Uidroot;Pwd123123;Connection Timeout60;Default Command Timeout120;SslModeDisabled;AllowPublicKeyRetrievaltrue;,// 方案2: 使用最小配置Server127.0.0.1;Port3306;Databasedb;Uidroot;Pwd123123;Connection Timeout60;,// 方案3: 禁用连接池Server127.0.0.1;Port3306;Databasedb;Uidroot;Pwd123123;Connection Timeout60;Poolingfalse;};Console.WriteLine(开始测试数据库连接...\n);for(inti0;iconnectionStrings.Length;i){Console.WriteLine($测试连接字符串 #{i1}:);Console.WriteLine($------------------------);try{usingvarconnectionnewMySqlConnection(connectionStrings[i]);varstartTimeDateTime.Now;connection.Open();varconnectTimeDateTime.Now-startTime;Console.WriteLine($✅ 连接成功 - 耗时:{connectTime.TotalMilliseconds}ms);Console.WriteLine($MySQL 版本:{connection.ServerVersion});// 测试简单查询usingvarcommandnewMySqlCommand(SELECT COUNT(*) FROM mes_dc_electricdata,connection);command.CommandTimeout30;startTimeDateTime.Now;varcountcommand.ExecuteScalar();varqueryTimeDateTime.Now-startTime;Console.WriteLine($✅ 查询成功 - 数据量:{count}行 - 耗时:{queryTime.TotalMilliseconds}ms);Console.WriteLine();}catch(MySqlExceptionex){Console.WriteLine($❌ 连接失败 - MySQL错误:{ex.Message});Console.WriteLine($错误代码:{ex.Number});Console.WriteLine($连接字符串:{connectionStrings[i]});Console.WriteLine();}catch(Exceptionex){Console.WriteLine($❌ 连接失败 - 一般错误:{ex.Message});Console.WriteLine($连接字符串:{connectionStrings[i]});Console.WriteLine();}}Console.WriteLine(测试结束按任意键退出...);Console.ReadKey();}}3. 深入分析为什么高延迟网络下认证会失败测试结果明确显示策略都失败了。这让我把注意力集中到了MySQL 8.0的认证机制上。MySQL认证机制的演进与影响MySQL 5.x默认使用mysql_native_password认证单次往返MySQL 8.0默认使用caching_sha2_password认证多次往返网络往返次数的巨大影响认证方式网络往返次数低延迟环境高延迟环境30msmysql_native_password1次几乎无感知可接受30-50mscaching_sha2_password3-4次轻微影响严重问题100-200ms在跨地域网络环境下每次往返都增加30-50ms延迟多次往返很容易超过客户端的默认超时设置。4. 我的完整解决步骤实测有效基于以上分析我采取了双重措施确保问题彻底解决第一步修改MySQL认证插件根本解决在远程MySQL服务器上执行以下命令-- 1. 查看当前认证插件SELECTuser,host,pluginFROMmysql.userWHEREuserroot;-- 2. 修改认证插件为mysql_native_passwordALTERUSERroot%IDENTIFIEDWITHmysql_native_passwordBY你的密码;-- 3. 创建专用应用账户生产环境推荐略过也可以、直接使用root账户CREATEUSERapp_user%IDENTIFIEDWITHmysql_native_passwordBY强密码;GRANTSELECT,INSERT,UPDATE,DELETEONapp_db.*TOapp_user%;-- 4. 刷新权限FLUSHPRIVILEGES;第二步重启MySQL服务关键步骤重要提醒修改认证插件后必须重启MySQL服务使更改完全生效# Linux系统sudosystemctl restart mysql# 或使用service命令sudoservicemysql restart# Windows系统服务方式net stop mysql net start mysql为什么需要重启虽然FLUSH PRIVILEGES会重新加载权限表但某些情况下认证插件的更改需要完全重启服务才能在所有连接上生效特别是在有活跃连接或连接池的情况下。第三步优化连接字符串在应用程序中使用优化后的连接字符串// 生产环境推荐配置stringconnectionStringServer127.0.0.1;Port3306;Databaseapp_db;Uidapp_user;// 使用专用账户Pwd强密码;Connection Timeout60;// 适当增加连接超时Default Command Timeout120;// 增加命令超时SslModeNone;// 高延迟环境可考虑禁用SSLAllowPublicKeyRetrievaltrue;// 允许公钥检索Poolingtrue;// 启用连接池Min Pool Size5;// 连接池优化Max Pool Size50;ConnectionLifeTime180;;// 连接生命周期5. 验证结果与测试完成上述步骤后我在本地和远程服务器上分别运行测试程序结果令人满意测试策略 #1: ------------------------ ✅ 连接成功 - 耗时: 152ms MySQL 版本: 8.0.44 ✅ 查询成功 - 数据量: 1542 行 - 耗时: 89ms 测试策略 #2: ------------------------ ✅ 连接成功 - 耗时: 168ms MySQL 版本: 8.0.44 ✅ 查询成功 - 数据量: 1542 行 - 耗时: 92ms 测试策略 #3: ------------------------ ✅ 连接成功 - 耗时: 161ms MySQL 版本: 8.0.44 ✅ 查询成功 - 数据量: 1542 行 - 耗时: 95ms所有三种策略全部成功这证明认证插件修改已生效重启MySQL服务是必要的问题得到彻底解决6. 生产环境完整解决方案架构最佳实践专用数据库用户永远不要在生产环境使用root账户进行应用连接连接池调优根据实际并发量调整连接池参数监控告警设置连接超时、慢查询的监控告警.NET Core应用配置services.AddDbContextAppDbContext(options{options.UseMySql(Configuration.GetConnectionString(Default),newMySqlServerVersion(newVersion(8,0,4)),mysqlOptions{// 启用重试机制应对网络波动mysqlOptions.EnableRetryOnFailure(maxRetryCount:5,maxRetryDelay:TimeSpan.FromSeconds(10),errorNumbersToAdd:null);// 设置适当的命令超时mysqlOptions.CommandTimeout(120);// 启用详细日志调试用mysqlOptions.EnableDetailedErrors(true);});});7. 总结与经验分享关键收获MySQL 8.0的认证机制变革caching_sha2_password在高延迟网络下可能成为瓶颈重启服务的重要性修改认证插件后必须重启MySQL服务系统化测试方法编写全面的测试程序能加速问题定位排查建议遇到类似连接问题时建议按以下顺序排查网络层端口连通性测试传输层TCP连接测试认证层认证机制检查应用层连接参数优化预防措施新项目在跨地域部署前预先评估网络延迟影响考虑在MySQL初始化时直接使用mysql_native_password建立部署检查清单包含数据库连接测试项目最终效果经过上述步骤系统已在跨地域环境下稳定运行两周未再出现连接超时问题。希望这篇完整的实战记录能为遇到类似问题的朋友提供有价值的参考。欢迎交流如果你在实践中遇到类似问题或有更好的解决方案欢迎在评论区分享讨论

相关新闻