这里有一个奇怪的问题。我有一个使用 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 客户端可以使用相同的凭据从同一个机器进行连接
所有这些系统都在我们的公司防火墙内,由同一组运行。 因此,它们都应该具有非常相似的配置。
有什么想法吗?谢谢
好的,亚历克西斯威尔克明白了 - 有点。 这是一个端口问题,尽管我仍然不确定这是如何发生的。 mysql_real_connect() 的第 6 个参数是端口号。 0 表示应使用默认端口 (3306):http://dev.mysql.com/doc/refman/5.7/en/mysql-real-connect.html
如果端口不为 0,则该值用作 TCP/IP 的端口号 连接。请注意,host 参数确定 连接。
默认端口为 3306。 如果我明确地将 3306 放在那里,则连接有效。 不知道为什么它不默认为这个盒子上的那个端口,或者它试图使用什么端口。 同样,这个相同的可执行文件适用于其他几个配置非常相似的框,第 6 个参数中为 0。 而且我多年来一直在使用相同的连接代码,以前从未见过这个。 很奇怪。
也许这个版本的库中有错误? 尽管对于如此大而不微妙的事情来说,这似乎不太可能。
嗯,我也有类似的问题,比如CoAstroGeek。
我可以在本地主机中连接到 MySQL 数据库,但不能连接到远程主机中的 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;
}
}