【发布时间】:2013-11-12 23:16:40
【问题描述】:
这里有一个奇怪的问题。 我有一个使用 MySQL C 库编写的 C++ 应用程序。它执行以下操作:
- 连接到远程 MySQL 服务器
- 检索一些数据
- 分析数据
- 将结果推送回数据库服务器
- 关闭数据库
CentOS 6 上的 MySQL 服务器是 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 客户端可以使用相同的凭据从同一框进行连接
所有这些系统都在我们公司的防火墙内,并由同一组运行。所以他们应该都有一个非常相似的配置。
有什么想法吗? 谢谢
【问题讨论】:
-
我注意到您的失败消息代码包括回显给您的 dbserver、dbname 和 dbuser。所以大概你在那里看到了预期值。考虑包含 dbpassword 以查看该值是否也符合预期。
-
它将确保使用默认端口以及是否存在阻止连接的防火墙规则。
-
AllInOne - 是的,连接参数的回显是正确的。此特定连接不使用密码 - 内部项目等等。
-
Alexis - 我假设命令行客户端使用与基于 C 库的连接相同的端口。命令行客户端可以工作,所以我假设端口没问题。将对此进行调查,看看他们是否使用不同的端口 - 这肯定可以解释它。