2

这里奇怪的问题。我有一个使用 MySQL C 库编写的 C++ 应用程序。它执行以下操作:

  • 连接到远程 MySQL 服务器
  • 检索一些数据
  • 分析数据
  • 将结果推送回数据库服务器
  • 关闭数据库

MySQL 服务器是 CentOS 6 上的 v5.1.61 客户端在各种 linux 发行版上从命令行运行良好 - CentOS 6、Ubuntu、Scientific Linux 6.4

除了一台特定的 Scientific Linux 6.3 机器外,它在所有这些机器上都可以正常工作。恰好是簇头节点 - 即。我需要去哪里才能获得真正的马力!

当我尝试在这里运行它时,我得到以下信息:

2003    :       Can't connect to MySQL server on 'hostname' (111)

AFAIK,这通常表示权限或网络问题。

但是,我可以使用相同的凭据通过 mysql 命令行客户端连接到服务器。

我试过的:

  • 使用命令行 mysql 客户端从问题机器连接到服务器。排除权限问题或错误凭据。
  • 在这个盒子上重新编译了 C++ exe (g++ 4.4.7) 以确保它不是某种库不兼容。没变。
  • 我已经用相同的行为尝试了服务器主机名和 IP 地址。排除名称解析问题。
  • 尝试使用我的 exe 和 CL 客户端连接到不同的 MySQL 服务器 - 相同的行为。表示客户端问题不是特定的 mysql 服务器

C++ 代码使用 mysql C 库中的 mysql_real_connect()。多年来,我在许多不同的程序和许多不同的数据库中都使用了相同的连接代码——它有效。到现在。

int MakeDbConnect(MYSQL **db, const string &dbserver, const string &dbname,
                  const string &dbuser, const string &dbpasswd)
{
   *db = mysql_init(NULL);

   if (mysql_real_connect(*db, dbserver.c_str(), dbuser.c_str(),
                          dbpasswd.c_str(), dbname.c_str(), 0, NULL, 0) == NULL)
   {
      cout << "ERROR: Call to mysql_real_connect() failed:\t"
           << mysql_errno(*db) << "\t:\t" << mysql_error(*db) << endl;
      cout << "\tServer:  \t" << dbserver << endl;
      cout << "\tDatabase:\t" << dbname << endl;
      cout << "\tUser:    \t" << dbuser << endl;

      return -1;
   }

   return 0;
}

再说一次,

  • 这个可执行文件可以在其他几个 linux 机器上正常工作。
  • 它没有从一个特定的盒子连接
  • linux 命令行 mysql 客户端可以使用相同的凭据从同一个框进行连接

所有这些系统都在我们的公司防火墙内,并由同一组运行。所以它们都应该具有非常相似的配置。

有任何想法吗?谢谢

4

2 回答 2

2

好的,亚历克西斯威尔克明白了 - 有点。这是一个端口问题,尽管我仍然不确定这是如何发生的。mysql_real_connect() 的第 6 个参数是端口号。0 表示应该使用默认端口(3306):http: //dev.mysql.com/doc/refman/5.7/en/mysql-real-connect.html

如果端口不为 0,则该值用作 TCP/IP 连接的端口号。请注意,主机参数决定了连接的类型。

默认端口是 3306。如果我明确地将 3306 放在那里,则连接有效。不知道为什么它没有默认使用这个盒子上的那个端口或它试图使用的端口。同样,这个相同的可执行文件适用于其他几个配置非常相似的盒子,第 6 个参数为 0。而且我多年来一直在使用相同的连接代码,以前从未见过这种情况。很奇怪。

也许这个版本的库中有一个错误?尽管对于这么大而微妙的事情来说,这似乎不太可能。

于 2013-11-13T17:34:58.827 回答
0

好吧,我遇到了类似 CoAstroGeek 的问题。

我可以连接到本地主机中的 MySQL 数据库,但不能连接到远程主机,因为我没有明确指定端口。当我指定 _iPort = 3306 时,它起作用了!感谢 CoAstroGeek 和 Alexis!

bool DBConnectorMySQL::connect(bool bDebug)
{
    _pMySQL_Conn = mysql_init(NULL);
    my_bool myb = true;
    mysql_options(_pMySQL_Conn, MYSQL_OPT_RECONNECT, &myb);
    if (_bEnableSetEncodingUTF8)
    {
        mysql_options(_pMySQL_Conn, MYSQL_SET_CHARSET_NAME, "utf8");
        mysql_options(_pMySQL_Conn, MYSQL_INIT_COMMAND, "SET NAMES `utf8`");
    }
    if (mysql_real_connect(_pMySQL_Conn, _sHost.c_str(), _sUsername.c_str(),
            _sPwd.c_str(), _sDatabase.c_str(), _iPort, NULL, 0) == NULL)
    {
        if (bDebug) cerr << "Problem encountered connecting to the "
                << _sDatabase << " database on " << _sHost << endl;
        cout << "mysql_error: #" << mysql_errno(_pMySQL_Conn) << " - "
                << mysql_error(_pMySQL_Conn) << endl;
        _pErrorHandler->setErrorCode((int)DBCONNECTORMYSQL_CANNOT_CONNECT_DB);
        return false;
    }
    else
    {
        if (bDebug) cout << "Connected to the " << _sDatabase << " database on "
                << _sHost << " as user " << _sUsername << endl;
        return true;
    }
}
于 2017-05-31T12:55:30.430 回答