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.