MySQL त्रुटि: (2003, "2001: db8: 81: 2c :: 2 '(-9)" पर MySQL सर्वर से कनेक्ट नहीं किया जा सकता ")


15

मैं ज़ेनॉस 4.2.0 को CentOS 6.3 पर स्थापित करने के लिए IPv6 के माध्यम से एक दूरस्थ MySQL 5.5.25a सर्वर की निगरानी करने की कोशिश कर रहा हूं। निगरानी सर्वर के लिए फ़ायरवॉल खुला है और मैं कमांड लाइन से ठीक कनेक्ट कर सकता हूँ:

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

ज़ेनॉस, हालांकि, एक घटना "प्लगइन से कोई प्रदर्शन डेटा नहीं" उत्पन्न करता है, जिसका विवरण शिकायत करता है कि यह सर्वर से कनेक्ट नहीं हो सकता है:

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

जहाँ तक मुझे पता है, -9 एक मान्य ग़लती भी नहीं है। और निश्चित रूप से यह एक नकारात्मक संख्या Google के लिए असंभव है ।

यहाँ छवि विवरण दर्ज करें

मैंने zMySqlUsername और zMySqlPassword की जाँच की है - एक से अधिक बार - और उनके पास सही मान हैं।

मैंने कोष्ठक के साथ IPv6 पते में प्रवेश करने की भी कोशिश की है, लेकिन MySQL को ज़ेनॉस के भीतर या कमांड लाइन पर ऐसा बिल्कुल भी पसंद नहीं है।

इस समस्या का कारण क्या है?


यदि बाकी सब विफल रहता है तो आप IPv4 पर वापस नहीं लौट सकते?
जॉन गार्डनियर्स

@ जॉनगार्डेनियर्स कभी-कभी। लेकिन निगरानी की जाने वाली कई मशीनों में वैश्विक IPv4 पते नहीं हैं, इसलिए ज़ेनॉस प्रॉक्सी की आवश्यकता होगी। अन्य बातों के अलावा, मैं उससे दूर जाने की कोशिश कर रहा हूं।
माइकल हैम्पटन

ठीक है, मैंने सोचा था कि यह एक विकल्प हो सकता है, विशेष रूप से IPv6 बहुत सारे उत्पादों में इतना अधूरा या अपूर्ण होने के साथ।
जॉन गार्डनियर्स

जवाबों:


11

मैंने आखिरकार हार मान ली और खुद ही इस पर बहस करने लगा।

@ SelivanovPavel के उत्तर के आधार पर मैंने डिबगिंग चालू की zencommandऔर प्रतीक्षा की, और निश्चित रूप से पर्याप्त, ज़ेनपैक विफल हो रहा था।

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। न कि कैसे मैं अपनी दोपहर बिताना चाहता था।

यह थोड़ा बुरा हैकरी काम कर जाता है (हालांकि आपको पायथन 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 ...

ज़ेनॉस लॉग्स (सेटिंग्स> डेमोंस) के बारे में क्या? लॉग वर्बोसिटी बढ़ाने के लिए प्रयास करें (logseverity = 30 सेट करें) और देखें कि क्या होता है।

यह डॉक उपयोगी हो सकता है: समस्या निवारण_जेनॉस


आपको इनाम मिलता है क्योंकि आप समस्या के स्रोत के लिए दूसरे आदमी की तुलना में करीब आए थे। धन्यवाद। :)
माइकल हैम्पटन

3

इसे ब्रैकेट में डालने का प्रयास करें [2001: 470: ...] या ipv6: []। एक महान कई पार्सर पाठ प्रविष्टि और v6 पते के बीच अंतर नहीं कर सकते हैं।


1
वहाँ किया गया था कि। MySQL, कम से कम, कोष्ठक के बिना IP पता चाहता है।
माइकल हैम्पटन

2
यह त्रुटि कोड उन पुस्तकालयों से हो सकता है, जो ज़ेनॉस मायस्कल से ही उपयोग कर रहे हैं। यह ज्यादातर पाइथन में लिखा है अगर मुझे सही से याद है, तो यह संकेत देने के लिए एक जगह हो सकती है।
rnxrx

1
अगर मुझे सोर्स कोड में खुदाई करनी है, तो मैं अपने सवाल का जवाब दूंगा। फिर। :)
माइकल हैम्पटन

3
क्या यह खुला स्रोत की सुंदरता नहीं है, हालांकि? हम सभी अपने स्वयं के कीड़े <किडिंग> को ठीक कर सकते हैं। हे - एक और विचार, हालांकि। क्या होगा यदि आप एक मानक होस्टनाम सेट करते हैं जो केवल एक AAAA में हल होता है और फिर कच्चे आईपी के बजाय उस होस्टनाम का उपयोग किया जाता है?
rnxrx
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.