随机MySQL异常-更改数据库时“从流读取失败”

时间:2018-09-17 05:31:21

标签: c# mysql

这个问题已经存在很长时间了。 有成千上万的用户计算机一直试图同时连接到MySQL,并通过不断根据要求更改数据库来对多个数据库进行查询。

要更改数据库,这就是客户端计算机拥有的-

private MySqlConnection Conn;

public void ChangeDatabase(string DatabaseName)
{
    if (Conn.State != ConnectionState.Open)
    {
        Conn.Open();
    }
    Conn.ChangeDatabase(DatabaseName);
}

根据我们的猜测,在某些情况下,发生数据库更改时,我们会获得Exeption-

[正在捕获标准异常:MySql.Data.MySqlClient.MySqlException]使用方法'mysql_native_password'对用户'----'主机'_._._._'进行身份验证失败,消息:从流中读取失败。

这是堆栈跟踪-

    Void Trace(System.Exception) [FileName: ; Line:0].
    Void TimerProcess_Elapsed(System.Object, System.Timers.ElapsedEventArgs) [FileName: ; Line:0].
    Void MyTimerCallback(System.Object) [FileName: ; Line:0].
    Void CallCallbackInContext(System.Object) [FileName: ; Line:0].
    Void RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
    Void Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
    Void CallCallback() [FileName: ; Line:0].
    Void Fire() [FileName: ; Line:0].
    Void FireNextTimers() [FileName: ; Line:0].
    Void AppDomainTimerCallback() [FileName: ; Line:0]. 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.MySqlConnection.Open() at
    FSCCClientUploadServiceLive.ProcessClientUpload.TimerProcess_Elapsed(Object sender, ElapsedEventArgs e)
----------------------------------------------------------
Time stamp 18/09/2018 12:25:48.325
Thread details 27
Message:    [InnerException] Reading from the stream has failed.
Detail: [Source] MySql.Data
Stack Trace:
    Void Trace(System.Exception) [FileName: ; Line:0].
    Void TimerFinish_Elapsed(System.Object, System.Timers.ElapsedEventArgs) [FileName: ; Line:0].
    Void MyTimerCallback(System.Object) [FileName: ; Line:0].
    Void CallCallbackInContext(System.Object) [FileName: ; Line:0].
    Void RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
    Void Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
    Void CallCallback() [FileName: ; Line:0].
    Void Fire() [FileName: ; Line:0].
    Void FireNextTimers() [FileName: ; Line:0].
    Void AppDomainTimerCallback() [FileName: ; Line:0].
       at MySql.Data.MySqlClient.MySqlStream.LoadPacket()
   at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
   at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.ReadPacket()
----------------------------------------------------------
Time stamp 18/09/2018 12:25:49.093
Thread details 27
Message:    [InnerException] Attempted to read past the end of the stream.
Detail: [Source] MySql.Data
Stack Trace:
    Void Trace(System.Exception) [FileName: ; Line:0].
    Void TimerFinish_Elapsed(System.Object, System.Timers.ElapsedEventArgs) [FileName: ; Line:0].
    Void MyTimerCallback(System.Object) [FileName: ; Line:0].
    Void CallCallbackInContext(System.Object) [FileName: ; Line:0].
    Void RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
    Void Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [FileName: ; Line:0].
    Void CallCallback() [FileName: ; Line:0].
    Void Fire() [FileName: ; Line:0].
    Void FireNextTimers() [FileName: ; Line:0].
    Void AppDomainTimerCallback() [FileName: ; Line:0].
       at MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count)
   at MySql.Data.MySqlClient.MySqlStream.LoadPacket()

此问题通常不会出现。当一切运行正常时,它突然突然出现。

为此,我尝试了SO上可用的其他解决方案,但没有一个对我们有帮助。正如我所猜测的那样,该异常主要发生在数据库更改的情况下。

2 个答案:

答案 0 :(得分:0)

解决方案1:(如果不需要SSL)。由于它是由SSL引起的,因此我们可以通过在连接字符串后附加“ SslMode = None”来关闭SSL。

解决方案2::如果需要SSL,则服务器身份很重要,需要进行验证。服务器需要Internet连接才能进行证书验证。请注意,crypto API不会为每个进程更新CTL。 CTL保持在操作系统级别。将服务器连接到Internet并与服务器建立SSL数据库连接后,CTL将自动更新。然后,您可以断开Internet连接。再次注意,CTL有其到期日期,此后Windows需要再次更新它。这可能会在几个月后发生。

解决方案3::如果需要SSL,但是服务器身份并不重要。通常,在这种情况下,SSL仅用于加密网络传输。我们可以关闭CTL更新:

  1. 按Win + R打开“运行”对话框,键入“ gpedit.msc”(不带引号),然后按Enter
  2. 在“本地组策略编辑器”中,依次展开“计算机配置”,“管理模板”,“系统”,“ Internet通讯管理”,然后单击“ Internet通讯设置”。
  3. 在详细信息面板中,双击“关闭自动根证书更新”,单击“启用”,然后单击“确定”。此更改将立即生效,无需重启。

https://blog.csdn.net/fancyf/article/details/78295964清楚地说明了根本原因和解决方案。

答案 1 :(得分:0)

我读了很多解决方案时最困惑,并且出现在此链接的各处,因为它被大量引用。 https://blog.csdn.net/fancyf/article/details/78295964

但是很直接的问题是无法建立连接。

在我的情况下,本地连接到mySQL服务器时效果很好。 但是当部署到Windows Server 2012 R2时,出现了错误。

在Google上搜索一段时间后的解决方案是:

通过将其添加到连接字符串中来增加连接超时: 连接超时= 30 https://www.connectionstrings.com/mysql-connector-net-mysqlconnection/specifying-connection-attempt-timeout/

因此,我认为2台服务器需要时间进行协商和握手,因此默认时间范围还不够。