2013-11-12 4 views
2

Странная проблема здесь. У меня есть приложение 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 может соединиться с этой же коробке с использованием идентичных учетных

Все эти системы находятся внутри нашего корпоративного брандмауэра и запустить тот же группа. Поэтому они должны иметь очень похожую конфигурацию.

Любые идеи? Спасибо

+0

Я заметил, что ваш код сообщения об отказе включает в себя эхо-файлы обратно к вам dbserver, dbname и dbuser. Так что предположительно вы видите ожидаемые значения. Рассмотрим, в том числе, dbpassword, чтобы узнать, так ли это значение. – AllInOne

+1

Он будет следить за тем, чтобы использовался порт по умолчанию, и существует ли правило брандмауэра, блокирующее соединение. –

+0

AllInOne - Да, эхо параметров соединения правильное. Это конкретное соединение не использует пароль - внутренний проект и все такое. – CoAstroGeek

ответ

2

Хорошо, Alexis Wilke получил это - вроде. Это проблема портов, хотя я все еще не уверен, как это происходит. 6-й аргумент для mysql_real_connect() - номер порта. 0 указывает на то, что порт по умолчанию (3306) следует использовать: http://dev.mysql.com/doc/refman/5.7/en/mysql-real-connect.html

Если порт не равен 0, то значение используется в качестве номера порта для TCP/IP связи. Обратите внимание, что параметр host определяет тип соединения .

Порт по умолчанию - 3306. Если я помещаю 3306 там явно, соединение работает. Не знаю, почему он не выполняет по умолчанию этот порт на этом поле или какой порт он пытается использовать. Опять же, этот же исполняемый файл работает в нескольких других коробках с очень похожей конфигурацией с 0 в 6-м аргументе. И я использую тот же код соединения в течение многих лет и никогда не видел этого раньше. Очень странно.

Возможно, ошибка в этой версии библиотеки? Хотя это кажется маловероятным для чего-то такого большого и неубедительного.

0

У меня была аналогичная проблема, например, CoAstroGeek.

Я мог подключиться к базе данных MySQL в localhost, но НЕ на удаленном хосте, поскольку я не указал порт явно. Когда я указал _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; 
    } 
} 
Смежные вопросы