MySQL Hatası: (2003, “'2001: db8: 81: 2c :: 2' (-9) üzerinde MySQL sunucusuna bağlanamıyor”))


15

IPv6 üzerinden uzak bir MySQL 5.5.25a sunucusunu izlemek için CentOS 6.3 üzerinde Zenoss 4.2.0 kurmaya çalışıyorum. Güvenlik duvarı izleme sunucusu için açık ve komut satırından iyi bağlanabilirim:

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

Ancak Zenoss, ayrıntıları sunucuya bağlanamadığından şikayet eden bir "Eklentiden performans verisi yok" etkinliği oluşturur:

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

Bildiğim kadarıyla, -9 geçerli bir hata bile değil. Ve elbette Google'a negatif bir sayı vermek imkansız .

resim açıklamasını buraya girin

ZMySqlUsername ve zMySqlPassword - bir kereden fazla - kontrol ettim ve doğru değerlere sahipler.

Ben de köşeli parantez ile IPv6 adresi girmeye çalıştım, ama MySQL Zenoss içinde veya komut satırında hiç hoşlanmıyor.

Bu sorunun nedeni nedir?


Her şey başarısız olursa IPv4'e geri dönemez misiniz?
John Gardeniers

@JohnGardeniers Bazen. Ancak izlenecek makinelerin çoğunda global IPv4 adresleri yoktur, bu nedenle bir Zenoss proxy'si gerekli olacaktır. Diğer şeylerin yanı sıra, bundan uzaklaşmaya çalışıyorum.
Michael Hampton

Tamam, sadece bir seçenek olabileceğini düşündüm, özellikle IPv6'nın birçok üründe bu kadar eksik veya kusurlu olması.
John Gardeniers

Yanıtlar:


11

Sonunda vazgeçtim ve kendim hata ayıklamaya gittim.

@ SelivanovPavel'in cevabına dayanarak hata ayıklamayı açtım zencommandve bekledim ve yeterince eminim ZenPack başarısız oluyordu.

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 

Bu yüzden ZenPack'e girdim ve (görünüşte eski bir sürümü) ' pymysqlden ithal ettiğini öğrendim /opt/zenoss/lib/python.

Python komut satırından test yaparken, istisnanın nereden atıldığını keşfettim:

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

Ve connections.pyo genel çevrede teftiş ederken, korkularıma bir AF_INETsoket açmaya çalıştığını keşfettim ve bir soket açmak için hiçbir yerde kod yoktu AF_INET6. Boom, anında başarısız.

Mevcut sürümü pymysqlde bu eksikliği içeriyor gibi görünüyor; hiçbir IPv6 desteği yok.

Yani "cevap", düzeltmem gerekecek pymysql. Öğleden sonramı nasıl harcamak istediğimi değil.

Kötü bir hackery bu bit işler (Python 2.6 ihtiyacınız olsa da) alır. 660 numaralı hattı açın /opt/zenoss/lib/python/pymysql/connections.pyve AF_INETardından şu değişikliği yapın:

                 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'

O zamandan beri bu , yukarı akım pymysql'de düzeltilmiştir ve gelecekteki bir sürümde mevcut olmalıdır.


5

Kontrol edin, herhangi bir bağlantı denemesi var mı:

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

tshark, Wireshark paket yakalama programının konsol sürümüdür.

Zenoss servis kullanıcısı kök değilse - mysql'e kabuğundan bağlanmayı deneyin:

su zenoss
mysql ...

Zenoss günlükleri (Ayarlar> Daemons) ne olacak? Günlük ayrıntı düzeyini artırmaya çalışın (günlük değerini = 30 ayarlayın) ve ne olduğunu görün.

Bu doküman yararlı olabilir: Sorun Giderme_Zenoss


Ödül alırsın çünkü sorunun kaynağına diğer adamdan daha yaklaştın. Teşekkürler. :)
Michael Hampton

3

Parantez içine almayı deneyin [2001: 470: ...] veya ipv6: []. Pek çok ayrıştırıcı, metin girişi ile v6 adresi arasında ayrım yapamaz.


1
Orada bulundum, bitti. MySQL, en azından, parantez olmadan IP adresini istiyor.
Michael Hampton

2
Bu hata kodu, mysql yerine Zenoss'un kullandığı kütüphanelerden olabilir. Doğru hatırlıyorsam çoğunlukla Python'da yazılıyor, bu yüzden bir ipucu aramak için bir yer olabilir.
rnxrx

1
Eğer kaynak kodunu araştırmak zorunda kalırsam, kendi sorumu cevaplayacağım. Tekrar. :)
Michael Hampton

3
Yine de bu açık kaynakların güzelliği değil mi? Hepimiz kendi hatalarımızı düzeltebiliriz. Hey - yine başka bir düşünce. Yalnızca bir AAAA'ya çözümlenen ve daha sonra ham IP yerine bu ana bilgisayar adını kullanan standart bir ana bilgisayar adı ayarlarsanız ne olur?
rnxrx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.