Помилка MySQL: (2003, "Не вдається підключитися до сервера MySQL '2001: db8: 81: 2c :: 2' (-9)")


15

Я намагаюся налаштувати Zenoss 4.2.0 на CentOS 6.3 для контролю віддаленого сервера MySQL 5.5.25a через IPv6. Брандмауер відкритий для сервера моніторингу, і я можу добре підключити командний рядок:

[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 настільки неповний або недосконалий у багатьох продуктах.
John Gardeniers

Відповіді:


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_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'

З тих пір це було зафіксовано у upymysql висхідній версії та має бути доступним у майбутньому випуску.


5

Перевірте, чи є спроби підключення:

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

tshark - консольна версія програми захоплення пакетів Wireshark.

Якщо користувач служби zenoss не має root - спробуйте підключитися до mysql з його оболонки:

su zenoss
mysql ...

Що з журналами Zenoss (Налаштування> Демони)? Спробуйте збільшити багатослівність журналів (встановити logseverity = 30) і подивіться, що відбувається.

Цей документ може бути корисним: Усунення несправностей_Zenoss


Ви отримуєте винагороду за те, що ви підійшли ближче, ніж інший хлопець до джерела проблеми. Спасибі. :)
Майкл Хемптон

3

Спробуйте помістити його в дужки [2001: 470: ...] або ipv6: []. Дуже багато парсерів не можуть розмежовувати між текстовим записом та v6 адресою.


1
Був там зробив те. Принаймні, MySQL хоче IP-адресу без дужок.
Майкл Хемптон

2
Цей код помилки може бути з бібліотек, які використовує Zenoss, а не від самого mysql. Це написано здебільшого на Python, якщо я правильно пам’ятаю, так що це може бути місце, де слід шукати підказку.
rnxrx

1
Якщо мені доведеться перекопатися у вихідному коді, я нарешті відповім на власне запитання. Знову. :)
Майкл Хемптон

3
Хіба це не краса відкритого коду? Всі ми можемо виправити наші власні помилки <жарт>. Гей - хоча інша думка. Що робити, якщо ви встановили стандартне ім’я хоста, яке вирішило лише AAAA, а потім застосувало це ім'я замість необмеженої IP?
rnxrx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.