ここで奇妙な問題。MySQL C ライブラリを使用して作成した C++ アプリケーションがあります。次のことを行います。
- リモートの MySQL サーバーに接続します
- いくつかのデータを取得します
- データを分析する
- 結果をDBサーバーにプッシュします
- データベースを閉じる
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)
私の知る限り、これは通常、権限またはネットワークの問題を示しています。
ただし、同じ資格情報を使用して、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 クライアントは、同一の資格情報を使用して、この同じボックスから接続できます。
これらのシステムはすべて、企業のファイアウォール内にあり、同じグループによって実行されています。したがって、それらはすべて非常によく似た構成を持つ必要があります。
何か案は?ありがとう