Странная проблема здесь. У меня есть приложение C++, которое я написал с использованием библиотеки MySQL C. Он выполняет следующие функции:mysql удаленное соединение - mysql CL клиент работает, C++ приложение не
- подключается к удаленному серверу MySQL
- получить некоторые данные
- анализа данных
- толчок результаты обратно на сервер БД
- близко дб
MySQL-сервер v5.1.61 на CentOS 6 Клиент отлично работает из командной строки на разных дистрибутивах Linux - CentOS 6, Ubuntu, Scientific Linux 6.4
Он отлично работает на всех этих машинах, за исключением одного конкретного пакета Scientific Linux 6.3. Который является головным узлом кластера - т.е. где мне нужно идти, чтобы добраться до настоящей лошадиной силы!
Когда я пытаюсь запустить его здесь я получаю следующее:
2003 : Can't connect to MySQL server on 'hostname' (111)
AFAIK, это обычно указывает на разрешение или сетевую проблему.
Однако я могу подключиться к серверу через клиент командной строки mysql с идентичными учетными данными.
Что я пробовал:
- Подключен к серверу из проблемной машины с командной строкой тузд клиентом. Исправляет проблемы с разрешением или плохие учетные данные.
- перекомпилировал C++ exe (g ++ 4.4.7) в этом поле, чтобы убедиться, что это не какая-то несовместимость библиотеки. Без изменений.
- Я пробовал это как с именем хоста сервера, так и с IP-адресом с таким же поведением. Решает проблему разрешения имен.
- Пробовал подключаться к другому серверу MySQL с моим exe и CL-клиентом - такое же поведение. Указывает на проблему клиента, а не на определенный сервер mysql
Код C++ использует mysql_real_connect() из библиотеки mysql C. Я использовал один и тот же код соединения в течение многих лет во многих разных программах и во многих разных базах данных - он работает. До сих пор.
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;
}
Так снова,
- этот исполняемый отлично от нескольких других блоков Линукс работает.
- Он не соединяется с одной конкретной коробки
- командной строки MySQL клиент Linux может соединиться с этой же коробке с использованием идентичных учетных
Все эти системы находятся внутри нашего корпоративного брандмауэра и запустить тот же группа. Поэтому они должны иметь очень похожую конфигурацию.
Любые идеи? Спасибо
Я заметил, что ваш код сообщения об отказе включает в себя эхо-файлы обратно к вам dbserver, dbname и dbuser. Так что предположительно вы видите ожидаемые значения. Рассмотрим, в том числе, dbpassword, чтобы узнать, так ли это значение. – AllInOne
Он будет следить за тем, чтобы использовался порт по умолчанию, и существует ли правило брандмауэра, блокирующее соединение. –
AllInOne - Да, эхо параметров соединения правильное. Это конкретное соединение не использует пароль - внутренний проект и все такое. – CoAstroGeek