MySQL 错误:(2003,“无法连接到 MySQL 服务器上的 '2001:db8:81:2c::2' (-9)”)

Mic*_*ton 15 mysql ipv6 zenoss

我正在尝试在 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)
Run Code Online (Sandbox Code Playgroud)

然而,Zenoss 会生成一个事件“No performance data from plugin”,其详细信息抱怨它无法连接到服务器:

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

据我所知,-9 甚至不是有效的 errno。当然,谷歌搜索负数是不可能的。

在此处输入图片说明

我已经检查了 zMySqlUsername 和 zMySqlPassword - 不止一次 - 它们具有正确的值。

我也试过用括号输入 IPv6 地址,但 MySQL 根本不喜欢这样,无论是在 Zenoss 中还是在命令行上。

这个问题的原因是什么?

Mic*_*ton 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 
Run Code Online (Sandbox Code Playgroud)

所以我深入研究了 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)")
Run Code Online (Sandbox Code Playgroud)

在检查connections.py附近区域时,我惊恐地发现它正在尝试打开一个AF_INET套接字,但在任何地方都没有代码可以打开一个AF_INET6套接字。轰隆隆,瞬间失败。

当前版本pymysql似乎也包含这个不足;没有任何 IPv6 支持

所以“答案”是我将不得不修复pymysql. 不是我想如何度过我的下午。

这一点讨厌的hackery让事情开始工作(尽管你需要Python 2.6)。打开/opt/zenoss/lib/python/pymysql/connections.py并搜索AF_INET大约 660 行。然后进行以下更改:

                 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'
Run Code Online (Sandbox Code Playgroud)

这已经在上游 pymysql 中得到修复,应该在未来的版本中可用。


Sel*_*vel 5

检查,是否有任何连接尝试:

tshark -i br200 -f "host 2001:db8:81:2c::2"
Run Code Online (Sandbox Code Playgroud)

tshark 是抓包程序 Wireshark 的控制台版本。

如果 zenoss 服务用户不是 root - 尝试从他的 shell 连接到 mysql:

su zenoss
mysql ...
Run Code Online (Sandbox Code Playgroud)

Zenoss 日志(设置 > 守护进程)怎么样?尝试增加日志详细程度(设置日志严重性 = 30),看看会发生什么。

此文档可能有用:Troubleshooting_Zenoss