MySQL错误:(2003年,“无法连接到'2001:db8:81:2c :: 2'(-9)上的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甚至不是有效的错误号。当然,对Google来说,不可能是负数

在此处输入图片说明

我已经多次检查了zMySqlUsername和zMySqlPassword,它们具有正确的值。

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

这个问题是什么原因造成的?


如果其他所有方法都失败了,您是否不能回到IPv4?
约翰·加迪尼尔

@JohnGardeniers有时。但是许多要监视的计算机没有全局IPv4地址,因此将需要Zenoss代理。除其他外,我正在努力摆脱这一点。
迈克尔·汉普顿

好的,我只是认为这可能是一个选择,尤其是在许多产品中IPv6如此不完整或不完美的情况下。
约翰·加迪尼尔

Answers:


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)。打开/opt/zenoss/lib/python/pymysql/connections.py并搜索AF_INET660行附近的内容。然后进行以下更改:

                 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用户-尝试从其shell连接到mysql:

su zenoss
mysql ...

Zenoss日志(设置>守护程序)如何处理?尝试增加日志详细程度(设置logevereverity = 30),看看会发生什么。

该文档可能会很有用:故障排除_Zenoss


之所以得到赏金,是因为您比其他人更接近问题的根源。谢谢。:)
迈克尔·汉普顿

3

尝试将其放在方括号[2001:470:...]或ipv6:[]中。许多解析器无法区分文本条目和v6地址。


1
去过也做过。至少MySQL希望IP地址不带括号。
迈克尔·汉普顿

2
该错误代码可能来自Zenoss正在使用的库,而不是来自mysql本身。如果我没有记错的话,它主要是用Python编写的,因此这可能是寻找提示的地方。
rnxrx 2012年

1
如果必须深入研究源代码,我将最终回答自己的问题。再次。:)
迈克尔·汉普顿

3
但是,这不是开源的魅力吗?我们都可以修复自己的错误<kidding>。嘿-不过是另一个想法。如果您设置仅解析为AAAA的标准主机名,然后使用该主机名而不是原始IP,该怎么办?
rnxrx 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.