MySQL 오류 : (2003,“ '2001 : db8 : 81 : 2c :: 2'에서 MySQL 서버에 연결할 수 없습니다 '(-9))


15

IPv6을 통해 원격 MySQL 5.5.25a 서버를 모니터링하기 위해 CentOS 6.3에서 Zenoss 4.2.0을 설정하려고합니다. 방화벽은 모니터링 서버를 위해 열려 있으며 명령 행에서 올바르게 연결할 수 있습니다.

[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로 되돌릴 수 없습니까?
— John Gardeniers

@JohnGardeniers 가끔. 그러나 모니터링 할 많은 시스템에는 글로벌 IPv4 주소가 없으므로 Zenoss 프록시가 필요합니다. 무엇보다도, 나는 그것을 멀리하려고 노력하고 있습니다.
— Michael Hampton

좋아, 방금 옵션이 될 수 있다고 생각했는데, 특히 많은 제품에서 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.

파이썬 명령 줄에서 테스트 할 때 예외가 발생한 곳을 발견했습니다.

>>> 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이 필요하지만). 660 행 /opt/zenoss/lib/python/pymysql/connections.py을 열고 검색하십시오. AF_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에서 수정되었으며 이후 릴리스에서 제공 될 예정입니다.


5

연결 시도가 있는지 확인하십시오.

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

tshark는 패킷 캡처 프로그램 Wireshark의 콘솔 버전입니다.

zenoss 서비스 사용자가 루트가 아닌 경우 쉘에서 mysql에 연결하십시오.

su zenoss
mysql ...

Zenoss 로그 (설정> 데몬)는 어떻습니까? 로그의 세부 정보를 늘리고 (logeseverity = 30 설정) 어떤 일이 발생하는지보십시오.

이 문서는 유용 할 수 있습니다 : Troubleshooting_Zenoss


당신은 다른 사람보다 문제의 근원에 더 가까이 다가 갔기 때문에 현상금을 얻습니다. 감사. :)
— Michael Hampton

3

대괄호 [2001 : 470 : ...] 또는 ipv6 : []에 넣으십시오. 많은 파서는 텍스트 입력과 v6 주소를 구별 할 수 없습니다.


1
거기에 있었어요. 적어도 MySQL은 대괄호없이 IP 주소를 원합니다.
— Michael Hampton

2
이 오류 코드는 Zenoss가 mysql 자체가 아닌 라이브러리에서 가져온 것일 수 있습니다. 내가 올바르게 기억하고 있다면 대부분 파이썬으로 작성되었으므로 힌트를 찾을 수 있습니다.
— rnxrx

1
소스 코드를 파헤쳐 야한다면 내 질문에 대답하게 될 것입니다. 다시. :)
— Michael Hampton

3
그래도 오픈 소스의 아름다움은 아닌가? 우리는 모두 우리 자신의 버그 <kidding>를 고칠 수 있습니다. 이봐-또 다른 생각. AAAA로만 확인한 다음 원시 IP 대신 해당 호스트 이름을 사용하는 표준 호스트 이름을 설정하면 어떻게됩니까?
— rnxrx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.