MySQLエラー:(2003、「 '2001:db8:81:2c :: 2'でMySQLサーバーに接続できません(-9)」)


15

CentOS 6.3でZenoss 4.2.0をセットアップして、IPv6経由でリモートMySQL 5.5.25aサーバーを監視しようとしています。ファイアウォールは監視サーバーに対して開かれており、コマンドラインから正常に接続できます。

[root@zenoss ~]# mysql -u zenoss -p -h 2001:db8:81:2c::2
...
mysql> SELECT USER(),CURRENT_USER();
+-----------------------------------------+-----------------------------------------+
| USER()                                  | CURRENT_USER()                          |
+-----------------------------------------+-----------------------------------------+
| zenoss@2001:db8:16:bf:5054:ff:fec0:f7a5 | zenoss@2001:db8:16:bf:5054:ff:fec0:f7a5 |
+-----------------------------------------+-----------------------------------------+
1 row in set (0.09 sec)

ただし、Zenossは、「プラグインからのパフォーマンスデータがありません」というイベントを生成します。このイベントの詳細は、サーバーに接続できないことを訴えます。

MySQL Error: (2003, "Can't connect to MySQL server on '2001:db8:81:2c::2' (-9)")

私の知る限り、-9は有効なerrnoでもありません。そしてもちろん、Googleに負の数を設定することは不可能です。

ここに画像の説明を入力してください

zMySqlUsernameとzMySqlPasswordを複数回確認しましたが、正しい値があります。

また、かっこでIPv6アドレスを入力しようとしましたが、MySQLはZenoss内またはコマンドラインのいずれかでそれをまったく好みません。

この問題の原因は何ですか?


他のすべてが失敗した場合、IPv4に戻ることはできませんか?
ジョンガーデニアーズ

@JohnGardeniers時々。ただし、監視対象のマシンの多くにはグローバルIPv4アドレスがないため、Zenossプロキシが必要になります。とりわけ、私はそこから離れようとしています。
マイケルハンプトン

わかりました。特に多くの製品でIPv6が不完全または不完全であるため、これはオプションであると考えました。
ジョンガーデニアーズ

回答:


11

私は最終的にあきらめ、自分でこれをデバッグしに行きました。

@SelivanovPavelの回答に基づいて、私はデバッグを有効にしてzencommand待機し、そして確かに、ZenPackが失敗していました。

2012-08-16 18:16:14,092 INFO zen.zencommand: Datasource MySQL/mysql command: /opt/zenoss/ZenPacks/ZenPacks.zenoss.MySqlMonitor-2.2.0-py2.7.egg/ZenPacks/zenoss/MySqlMonitor/libexec/check_mysql_stats.py -H 2001:db8:81:2c::2 -p 3306 -u zenoss -w 'password' -g
2012-08-16 18:16:14,100 DEBUG zen.zencommand: Running /opt/zenoss/ZenPacks/ZenPacks.zenoss.MySqlMonitor-2.2.0-py2.7.egg/ZenPacks/zenoss/MySqlMonitor/libexec/check_mysql_stats.py
2012-08-16 18:16:14,544 DEBUG zen.zencommand: Datasource: mysql Received exit code: 1 Output: 'MySQL Error: (2003, "Can\'t connect to MySQL server on \'2001:db8:81:2c::2\' (-9)")\n'
2012-08-16 18:16:14,545 DEBUG zen.zencommand: Process MySQL/mysql stopped (1), 0.43 seconds elapsed 

私はZenPackに掘って、それは(の明らかに古いバージョン)をインポートして分かったようpymysql/opt/zenoss/lib/python

pythonコマンドラインからのテストで、例外がスローされている場所を発見しました。

>>> sys.path.insert(0, "/opt/zenoss/lib/python");
>>> import pymysql
>>> pymysql.install_as_MySQLdb()
>>> import MySQLdb
>>> self.conn = MySQLdb.connect(host="2001:db8:81:2c::2", port=3306, db='', user='zenoss', passwd='password')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/zenoss/lib/python/pymysql/__init__.py", line 93, in Connect
    return Connection(*args, **kwargs)
  File "/opt/zenoss/lib/python/pymysql/connections.py", line 504, in __init__
    self._connect()
  File "/opt/zenoss/lib/python/pymysql/connections.py", line 673, in _connect
    raise OperationalError(2003, "Can't connect to MySQL server on %r (%s)" % (self.host, e.args[0]))
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '2001:db8:81:2c::2' (-9)")

そしてconnections.py、その一般的な周辺を調べてみると、私は恐怖でAF_INETソケットを開こうとしていることを発見しましたAF_INET6。ソケットを開くコードはどこにもありませんでした。ブーム、すぐに失敗します。

現在のバージョンにpymysqlもこの欠陥が含まれているようです。IPv6のサポート一切ありません。

そのため、「答え」は修正する必要がありますpymysql。午後を過ごしたかったのではありません。

このちょっとした厄介なハッカーは、物事を機能させます(ただし、Python 2.6が必要です)。660行目を開いて/opt/zenoss/lib/python/pymysql/connections.py検索しAF_INETます。次に、次の変更を加えます。

                 if DEBUG: print 'connected using unix_socket'
             else:
-                sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-                t = sock.gettimeout()
-                sock.settimeout(self.connect_timeout)
-                sock.connect((self.host, self.port))
-                sock.settimeout(t)
+                sock = socket.create_connection((self.host, self.port), self.connect_timeout)
                 self.host_info = "socket %s:%d" % (self.host, self.port)
                 if DEBUG: print 'connected using socket'

これは上流のpymysqlで修正されており、将来のリリースで利用可能になるはずです。


5

チェックしてください、接続の試みがあります:

tshark -i br200 -f "host 2001:db8:81:2c::2"

tsharkは、パケットキャプチャプログラムWiresharkのコンソールバージョンです。

zenossサービスのユーザーがrootでない場合-シェルからmysqlに接続してみてください:

su zenoss
mysql ...

Zenossログ(設定>デーモン)についてはどうですか?ログの詳細度を設定して(logseverity = 30に設定)、何が起こるかを確認してください。

このドキュメントは役に立つかもしれません:Troubleshooting_Zenoss


あなたが他の人よりも問題の原因に近づいたので、あなたは報奨金を得ます。ありがとう。:)
マイケルハンプトン

3

括弧[2001:470:...]またはipv6:[]に入れてみてください。非常に多くのパーサーは、テキストエントリとv6アドレスを区別できません。


1
そこに行って、やった。少なくともMySQLは、括弧なしのIPアドレスが必要です。
マイケルハンプトン

2
このエラーコードは、mysql自体からではなく、Zenossが使用しているライブラリからのものである可能性があります。正しく覚えていれば、ほとんどPythonで書かれているので、ヒントを探す場所になるかもしれません。
rnxrx

1
ソースコードを掘り下げなければならない場合、自分の質問に答えることになります。再び。:)
マイケルハンプトン

3
しかし、それはオープンソースの美しさではありませんか?独自のバグをすべて修正できます<kidding>。ねえ-しかし、別の考え。AAAAのみに解決される標準のホスト名を設定し、生のIPの代わりにそのホスト名を使用した場合はどうなりますか?
rnxrx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.