【问题标题】:How to fix 'Authentication to host for user using method 'mysql_native_password' failed with message: Reading from the stream has failed.' in .NET如何修复“使用方法 'mysql_native_password' 对用户进行身份验证失败并显示消息:从流中读取失败。”在 .NET 中
【发布时间】:2019-10-09 04:06:28
【问题描述】:

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

在高容量期间(许多“作业”正在启动),此错误开始发生,而且频率很高(估计大约有 20 个作业受到影响)。 “有趣”的事情是,10 次中有 9 次发生此错误时,它出现在新作业的第一个 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 连接字符串(非认证)设置:

  • 加密=假;
  • AllowZeroDatetime=true;
  • CheckParameters=false;

我尝试过的事情:

  • SSL:大多数谷歌搜索这个问题都会出现完全相同的帖子,建议调整 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 无关,尤其是因为禁用连接池似乎可以解决此问题。

提前感谢您的帮助。

【问题讨论】:

  • 凹凸凹凸
  • 你有解决办法吗?

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-10-14
    • 2017-01-19
    • 2016-10-27
    • 2021-08-23
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多