Pomelo MySQL (.NET Core) 数据库故障后无法恢复
Pomelo MySQL (.NET Core) Can't Recover After Database Failure
昨晚 AWS RDS 有一个 "Internet Connectivity Issue" 很快就解决了。但是,我的应用程序(在 .NET Core 中运行并通过 Pomelo.EntityFrameworkCore.MySql 连接到 RDS MySQL 实例)永远无法重新建立与数据库的连接,即使 MySQL 服务器已恢复在线的。我测试了从我自己的本地机器连接,它工作得很好。然后我重新部署了 .NET Core 应用程序,一切都重新开始工作了。
是否有我需要重新创建的东西(也许是数据库上下文),或者是否有我需要刷新以尝试再次连接的正在缓存的东西?我通过主机名连接,我的连接字符串如下所示:
server=something.somewhere.us-east-2.rds.amazonaws.com;userid=XXXX;password=YYYYY;database=ZZZZ
这是抛出的异常:
MySqlException: Unable to connect to any of the specified MySQL hosts.
at MySqlConnector.Core.ServerSession+<ConnectAsync>d__56.MoveNext (C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:239)
下面是我在 Startup.cs 中创建数据库上下文的方式:
services.AddDbContext<BlayFapContext>(opt => opt.UseMySql(Settings.Instance.SQLConnectionString));
如有任何帮助,我们将不胜感激。
贾瓦
好的,我们弄清楚了发生了什么。 Pomelo 的 MySQL 包装器有一个问题,如他们的 git 回购协议中所述:https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql/issues/434
基本上,如果 MySQL 数据库在第一次使用连接字符串时不可用,那么它将被缓存为无效并且永远不会再次工作。您可以通过启动没有 MySQL 连接的服务轻松确认这一点,确认它不起作用,然后启动 MySQL 并确认该服务仍然不起作用。在发现第一个连接字符串无效后,它永远无法建立 MySQL 连接。
他们在 2.0.1 发布后不久就对其进行了修补,但从那时起他们就没有用新版本更新 Nuget,尽管这个问题是在 6 个月前发现的。因此,解决方法是检查他们的存储库源代码,然后自己对其进行修补。我们发现此处的修复工作正常:https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql/pull/456
那么,为什么要重试连接字符串?我们已经成功连接了!事实证明,俄亥俄州数据中心的互联网连接问题不仅限于 RDS,还影响了 EC2。作为修复的一部分,我们的 EC2 实例已重新启动,由于持续的连接问题,MySQL 连接在重新启动时无效。该连接的状态已被缓存,即使 MySQL 服务器重新上线,我们的服务也是如此。
贾瓦
昨晚 AWS RDS 有一个 "Internet Connectivity Issue" 很快就解决了。但是,我的应用程序(在 .NET Core 中运行并通过 Pomelo.EntityFrameworkCore.MySql 连接到 RDS MySQL 实例)永远无法重新建立与数据库的连接,即使 MySQL 服务器已恢复在线的。我测试了从我自己的本地机器连接,它工作得很好。然后我重新部署了 .NET Core 应用程序,一切都重新开始工作了。
是否有我需要重新创建的东西(也许是数据库上下文),或者是否有我需要刷新以尝试再次连接的正在缓存的东西?我通过主机名连接,我的连接字符串如下所示:
server=something.somewhere.us-east-2.rds.amazonaws.com;userid=XXXX;password=YYYYY;database=ZZZZ
这是抛出的异常:
MySqlException: Unable to connect to any of the specified MySQL hosts.
at MySqlConnector.Core.ServerSession+<ConnectAsync>d__56.MoveNext (C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:239)
下面是我在 Startup.cs 中创建数据库上下文的方式:
services.AddDbContext<BlayFapContext>(opt => opt.UseMySql(Settings.Instance.SQLConnectionString));
如有任何帮助,我们将不胜感激。
贾瓦
好的,我们弄清楚了发生了什么。 Pomelo 的 MySQL 包装器有一个问题,如他们的 git 回购协议中所述:https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql/issues/434
基本上,如果 MySQL 数据库在第一次使用连接字符串时不可用,那么它将被缓存为无效并且永远不会再次工作。您可以通过启动没有 MySQL 连接的服务轻松确认这一点,确认它不起作用,然后启动 MySQL 并确认该服务仍然不起作用。在发现第一个连接字符串无效后,它永远无法建立 MySQL 连接。
他们在 2.0.1 发布后不久就对其进行了修补,但从那时起他们就没有用新版本更新 Nuget,尽管这个问题是在 6 个月前发现的。因此,解决方法是检查他们的存储库源代码,然后自己对其进行修补。我们发现此处的修复工作正常:https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql/pull/456
那么,为什么要重试连接字符串?我们已经成功连接了!事实证明,俄亥俄州数据中心的互联网连接问题不仅限于 RDS,还影响了 EC2。作为修复的一部分,我们的 EC2 实例已重新启动,由于持续的连接问题,MySQL 连接在重新启动时无效。该连接的状态已被缓存,即使 MySQL 服务器重新上线,我们的服务也是如此。
贾瓦