如何解决“使用方法'mysql_native_password'对用户进行主机身份验证”失败并显示消息:从流读取失败。在.NET

时间:2019-05-22 15:51:05

标签: c# sql asp.net ssl connection-pooling

我创建了一个自定义Windows服务,该服务基于mysql表中的队列来缓存新作业(进程,而不是线程)。 “职位”是数据库密集型应用程序以及服务(从现在开始,我将其称为“经理”)。

在大量工作期间(启动了许多“工作”),此错误开始出现的频率有所提高(估计影响20个工作中的约1个)。 “有趣的”是,发生此错误时,十分之九的错误发生在新作业的第一个SQL命令中。我认为我没有在经理中看到过这种情况。极少数情况是在作业中间抛出此错误(每个作业执行数十条SQL命令)。

MySql.Data.MySqlClient.MySqlException (0x80004005): Authentication to host '***' for user '***' using method 'mysql_native_password' failed with message: Reading from the stream has failed. ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Reading from the stream has failed. ---> System.IO.EndOfStreamException: Attempted to read past the end of the stream.
   at MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count)
   at MySql.Data.MySqlClient.MySqlStream.LoadPacket()
   at MySql.Data.MySqlClient.MySqlStream.LoadPacket()
   at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
   at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.ReadPacket()
   at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.AuthenticationFailed(Exception ex)
   at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.ReadPacket()
   at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.Authenticate(Boolean reset)
   at MySql.Data.MySqlClient.NativeDriver.Authenticate(String authMethod, Boolean reset)
   at MySql.Data.MySqlClient.NativeDriver.Open()
   at MySql.Data.MySqlClient.Driver.Open()
   at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
   at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
   at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
   at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
   at MySql.Data.MySqlClient.MySqlPool.GetConnection()
   at MySql.Data.MySqlClient.MySqlConnection.Open()
   at MySql.Data.MySqlClient.MySqlHelper.ExecuteReader(String connectionString, String commandText, MySqlParameter[] commandParameters)

我的堆栈上的背景:

  • Windows Server 2016(管理器和作业在其上运行)
  • MySql.Data 6.10.8(用于.NET SQL集成的Nuget程序包)

SQL连接字符串(非身份验证)设置:

  • encrypt = false;
  • AllowZeroDatetime = true;
  • CheckParameters = false;

我尝试过的事情:

  • SSL:针对此问题的大多数Google搜索都提出了与建议调整SSL设置完全相同的帖子。我将只包含一个链接:http://www.voidcn.com/article/p-phfoefri-bpr.html(所有建议的解决方案都不适合我)

  • 连接池配置:我成功禁用了连接池(例如,在连接字符串中添加“ Pooling = false;”),但是我担心这不是一个好的长期解决方案。由于其性能优势,我希望能够使用和理解连接池。当然,禁用连接池并不是解决此问题的唯一方法。还有其他与连接池相关的设置,例如“连接重置”,但是我对使用它们并没有真正足够的了解,而且我发现每个参数的sql文档都太简短而无法真正掌握。我尝试增加MaxPool设置,但没有任何效果。还有一个“ ConnectionTimeout”设置,它设置连接在中止之前等待服务器响应的时间...我对此有一个疑问,当sql cmd等待池化连接打开时,它会执行吗只等待“ CommandTimeout”秒?

我运行的所有sql命令都使用MySqlHelper类,就像这样(我的某些命令只是以非常相似的方式使用ExecuteNonQuery):

using (MySqlDataReader sqlRdr = MySqlHelper.ExecuteReader(connString, cmdText, sqlParams.ToArray()))
{
    while (sqlRdr.Read())
    {
        ret.Add(getFromRdr(sqlRdr));
    }
}

我只是在“解决”该错误时遇到麻烦。我所做的大多数研究都在查找此异常,但这些内容只是回到同一篇有关调整SSL设置的文章。我的问题似乎与SSL不相关,尤其是因为禁用连接池似乎可以解决此问题。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用以下解决方案之一:

  1. 在toyr申请开始时添加ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
  2. 也许是“远程数据库访问主机”的问题。 “通过将外部域名添加到能够访问您网站上数据库的主机列表中,您可以允许外部Web服务器访问您的MySQL数据库。”