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

我试图在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。 当然, 谷歌是不可能的负数 。

在这里输入图像描述

我检查了zMySqlUsername和zMySqlPassword – 不止一次 – 他们有正确的值。

我也尝试用方括号inputIPv6地址,但是在Zenoss或命令行中,MySQL根本不喜欢这个地址。

这个问题的原因是什么?

我终于放弃了,自己去debugging这个。

基于@ SelivanovPavel的答案,我打开了debuggingzencommand并等待,果然,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,发现它是从/opt/zenoss/lib/python导入(显然是老版本的) pymysql

在从python命令行testing时,我发现exception被抛出的地方:

 >>> 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 。 不是我想如何度过我的下午。

这一点讨厌的hackery得到的东西工作(虽然你需要Python 2.6)。 打开/opt/zenoss/lib/python/pymysql/connections.py并在第660行左右searchAF_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中修复了 ,应该可以在将来的版本中使用。

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

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

tshark是数据包捕获程序Wireshark的控制台版本。

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

 su zenoss mysql ... 

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

这个文档可能是有用的: Troubleshooting_Zenoss

尝试把它放在括号[2001:470:…]或ipv6:[]中。 许多parsing器无法区分文本条目和v6地址。