这里奇怪的问题。我有一个使用 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 客户端可以使用相同的凭据从同一个框进行连接
所有这些系统都在我们的公司防火墙内,并由同一组运行。所以它们都应该具有非常相似的配置。
有任何想法吗?谢谢