Xamarin应用Wi-Fi可连Amazon RDS MySQL,移动数据连接超时问题
核心排查方向
RDS安全组IP白名单限制
Amazon RDS的安全组默认仅允许指定IP访问。你的Wi-Fi公网IP大概率已加入安全组入站规则,但移动数据的公网IP不在允许范围内。
操作:进入AWS控制台查看RDS实例的安全组配置,检查入站规则是否包含移动数据的公网IP段;可临时开放0.0.0.0/0(仅测试用,生产环境禁止)验证是否能连接。移动运营商端口封锁
部分移动运营商会封禁MySQL默认的3306端口,导致移动数据下无法建立连接。
操作:将RDS的MySQL端口修改为非默认值(如3307),更新连接字符串中的Port参数后测试;或用移动数据环境下的telnet工具测试telnet [RDS地址] 3306,确认端口是否连通。连接超时设置不足
移动数据网络稳定性弱于Wi-Fi,默认连接超时时间可能不足以完成握手。
操作:在连接字符串中添加Connection Timeout=60(或更长时间),延长超时阈值后重试。移动数据DNS解析失败
移动数据网络的DNS服务器可能无法正确解析RDS域名,导致无法定位主机。
操作:在手机移动数据环境下ping RDS域名,查看是否解析到正确IP;或直接在连接字符串中替换为RDS公网IP测试。应用网络权限限制
部分平台(如Android)需明确配置应用允许使用移动数据的权限。
操作:检查AndroidManifest.xml是否添加<uses-permission android:name="android.permission.INTERNET" />,并确认应用系统设置中未限制仅Wi-Fi联网。
错误信息
MySqlConnector.MySqlException (0x80004005): Connect Timeout expired. ---> MySqlConnector.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts. at MySqlConnector.Core.ServerSession.ConnectAsync (MySqlConnector.Core.ConnectionSettings cs, MySqlConnector.MySqlConnection connection, System.Int32 startTickCount, MySqlConnector.Core.ILoadBalancer loadBalancer, MySqlConnector.Protocol.Serialization.IOBehavior ioBehavior, System.Threading.CancellationToken cancellationToken) [0x002fb] in /_/src/MySqlConnector/Core/ServerSession.cs:437 at MySqlConnector.Core.ConnectionPool.ConnectSessionAsync (MySqlConnector.MySqlConnection connection, System.String logMessage, System.Int32 startTickCount, MySqlConnector.Protocol.Serialization.IOBehavior ioBehavior, System.Threading.CancellationToken cancellationToken) [0x000bc] in /_/src/MySqlConnector/Core/ConnectionPool.cs:367 at MySqlConnector.Core.ConnectionPool.GetSessionAsync (MySqlConnector.MySqlConnection connection, System.Int32 startTickCount, MySqlConnector.Protocol.Serialization.IOBehavior ioBehavior, System.Threading.CancellationToken cancellationToken) [0x00519] in /_/src/MySqlConnector/Core/ConnectionPool.cs:94 at MySqlConnector.Core.ConnectionPool.GetSessionAsync (MySqlConnector.MySqlConnection connection, System.Int32 startTickCount, MySqlConnector.Protocol.Serialization.IOBehavior ioBehavior, System.Threading.CancellationToken cancellationToken) [0x00767] in /_/src/MySqlConnector/Core/ConnectionPool.cs:124 at System.Threading.Tasks.ValueTask`1[TResult].get_Result () [0x0001b] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/Common/src/CoreLib/System/Threading/Tasks/ValueTask.cs:813 at MySqlConnector.MySqlConnection.CreateSessionAsync (MySqlConnector.Core.ConnectionPool pool, System.Int32 startTickCount, System.Nullable`1[T] ioBehavior, System.Threading.CancellationToken cancellationToken) [0x00120] in /_/src/MySqlConnector/MySqlConnection.cs:919 at MySqlConnector.MySqlConnection.CreateSessionAsync (MySqlConnector.Core.ConnectionPool pool, System.Int32 startTickCount, System.Nullable`1[T] ioBehavior, System.Threading.CancellationToken cancellationToken) [0x002f6] in /_/src/MySqlConnector/MySqlConnection.cs:941 at System.Threading.Tasks.ValueTask`1[TResult].get_Result () [0x0001b] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/Common/src/CoreLib/System/Threading/Tasks/ValueTask.cs:813 at MySqlConnector.MySqlConnection.OpenAsync (System.Nullable`1[T] ioBehavior, System.Threading.CancellationToken cancellationToken) [0x001c7] in /_/src/MySqlConnector/MySqlConnection.cs:425 at MySqlConnector.MySqlConnection.Open () [0x00000] in /_/src/MySqlConnector/MySqlConnection.cs:373
连接字符串
"Server=xxx;Port=3306;Database=xxx;Uid=xxx;Password=xxx.;Convert Zero Datetime=True;"
内容的提问来源于stack exchange,提问作者Spack09

