15 votos

Error MySQL: (2003, "no se Puede conectar al servidor MySQL en '2001:db8:81:2c::2' (-9)")

Estoy tratando de configurar Zenoss 4.2.0 en CentOS 6.3 a un monitor remoto MySQL 5.5.25 un servidor a través de IPv6. El firewall está abierto para el servidor de supervisión y puedo conectar bien desde la línea de comandos:

[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, sin embargo, genera un evento "Sin datos de rendimiento de plugin" cuyos detalles se quejan de que no puede conectar con el servidor:

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

Hasta donde yo sé, -9 ni siquiera es válido errno. Y, por supuesto, es imposible de Google un número negativo.

enter image description here

He comprobado zMySqlUsername y zMySqlPassword - más de una vez - y tienen los valores correctos.

También he intentado entrar en la dirección IPv6 con corchetes, pero MySQL no le gusta en absoluto, o dentro de Zenoss o en la línea de comandos.

¿Cuál es la causa de este problema?

11voto

Michael Hampton Puntos 88271

Finalmente me di por vencido y se fue a la depuración de esto mismo.

Basado en @SelivanovPavel la respuesta he activado la depuración en zencommand y esperó, y, efectivamente, el ZenPack estaba fallando.

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 

Así que me clavaron en la ZenPack y descubrió que era de importación (aparentemente a una versión antigua de) pymysql de /opt/zenoss/lib/python.

En la prueba el comando python línea he descubierto que la excepción era ser lanzado desde:

>>> 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)")

Y en la inspección de connections.py en que la vecindad en general descubrí para mi horror, que era intentar abrir una AF_INET de socket, y no había código en cualquier lugar para abrir un AF_INET6 de socket. Boom, instantánea fallar.

La versión actual de pymysql también parece contener esta deficiencia; sin el soporte de IPv6 en absoluto.

Así que la "respuesta" es que voy a tener que arreglar pymysql. ¿No quería pasar mi tarde.

Este bit de desagradable trucos consigue cosas de trabajo (aunque usted necesita Python 2.6). Abierto hasta /opt/zenoss/lib/python/pymysql/connections.py y la búsqueda de AF_INET , alrededor de la línea 660. A continuación, realice el siguiente cambio:

                 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'

Esto ha sido corregido en aguas arriba pymysql y debe estar disponible en una versión futura.

5voto

Selivanov Pavel Puntos 830

Comprobar, hay intentos de conexión:

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

tshark es la versión de la consola de programa de captura de paquetes de Wireshark.

Si zenoss servicio de usuario no es root, intente conectar a mysql desde su shell:

su zenoss
mysql ...

¿Qué acerca de Zenoss registros(Ajustes > Demonios)? Tratar de aumentar los registros de verbosidad(conjunto de logseverity = 30) y ver qué pasa.

Este documento puede ser útil: Troubleshooting_Zenoss

3voto

rnxrx Puntos 6464

Intenta ponerlo entre corchetes [2001:470:...] o ipv6:[]. Un gran número de analizadores no puede diferenciar entre una entrada de texto y un v6 de dirección.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X