MySQL - 身份验证(但只在某些时候)

时间:2014-09-09 11:32:40

标签: mysql authentication login windows-server-2012

我一次又一次地收到以下错误。

  

使用方法'mysql_native_password'对用户'root'的主机'localhost'进行身份验证失败,并显示消息:从流中读取失败。

我知道连接字符串是正确的 - 首先它在应用程序启动后进行测试,如果失败,应用程序会发出消息并退出。

其次,报告它的功能也在大多数情况下使用它来正确连接,它只是偶尔发生。

我尝试过更改为127.0.0.1,但似乎没有变化。

它位于Windows Server 2012 64位上。

我已将127.0.0.1 localhost添加到主机文件中。

99%的时间应用程序正常运行并连接到数据库,只是每次都会出现此错误。

最重要的是,我检查了show full processlist命令,我随时只有几个连接。

我迷失了解释这一点,无法弄清楚如何修复它。

谢谢, 吉姆

1 个答案:

答案 0 :(得分:0)

这是非常古老的,但是因为我刚刚找到了解决这个问题的方法,所以我会分享它,以防万一有人还在寻找它(据我所知,这是当前Mysql版本的一个问题)太)。

this bug report中记录了这类问题。

我在这里引用该错误报告中最重要的答案:

  

[2014年5月21日15:40] Francisco Alberto Tirado Zavala

     

Hello Jorge。

     

当您使用Client-Server应用程序时   当您创建连接时,连接由套接字执行   在客户端和服务器之间打开一个Socket,以及一个Id / ProccesId   在服务器中为该请求的连接分配/保留   客户。如果重新启动服务器,则丢失给客户端的Id,   所以你需要创建一个新的有效连接,打开一个新的套接字   从服务器获取有效的ID。

     

此外,您必须考虑服务器可以终止或关闭   连接如果连接在一段时间后处于非活动状态。如果你有   您的连接打开也可能会影响您的连接池,因为   连接打开意味着您的池连接较少:有10个   同时连接的客户端距离连接点少10个   服务器可用连接。

     

如果您无法更改应用程序中的设计(拥有全局设计)   连接),作为一种解决方法,您可以使用一种方法来验证它   连接有效,例如以下方法ping   服务器,如果ping失败,则再次打开连接:

....
MySqlConnection _conn = new MySqlConnection("MyConnectionString");
private void CheckConnection()
{
   if(!_conn.Ping())
   {
     _conn.Open();
   }
}
....
  

正如您所看到的,代码非常简单,并且可以在下面进行操作   方式:当连接尝试ping服务器时,如果连接是   无效,内部具有套接字信息的流将是   终止,连接将在状态关闭时设置   如果,将从连接池中删除无效连接   存在,然后再次打开连接将创建一个新连接   这意味着一个新的有效套接字。如果ping成功,那么你会   继续使用相同的连接。

     

要使用它,您可以在尝试对其执行操作之前调用它   数据库,连接将在无效时重新打开:

....
private void button1_Click(object sender, EventArgs e)
{
  //assuming that the connection is already open
  CheckConnectionState();
  var cmd = new MySqlCommand("select 1", _conn);
  cmd.ExecuteNonQuery();
}
....
  

这只是一种解决方法,到目前为止我知道所有的连接   任何数据库服务器都具有相同的行为:如果服务器是   重启任何连接都将丢失,以及服务器将丢失   清理每个未使用的连接。

     

感谢您的时间。