एक यूनिक्स सॉकेट के बजाय टीसीपी द्वारा कनेक्ट करने के लिए MySQL को मजबूर करने के लिए कैसे?


46

मैं mysqlट्रैफिक का विश्लेषण करना चाहूंगा । अभी, सभी mysql अनुरोध MySQL यूनिक्स सॉकेट में भेजे गए हैं:

unix  2      [ ACC ]     STREAM     LISTENING     3734388  15304/mysqld        /var/run/mysqld/mysqld.sock

मैं उस सॉकेट को अक्षम करने की कोशिश कर रहा हूं जो MySQL को लूपबैक के बजाय नेटवर्क सॉकेट का उपयोग करने के लिए मजबूर करता है। मैंने सभी socketनिर्देशों में my.cnfऔर debian.cnfफाइलों पर टिप्पणी करने की कोशिश की और MySQL को पुनः आरंभ किया लेकिन इससे कोई फर्क नहीं पड़ा ।

नेटवर्क पर MySQL को बाध्य करने के लिए मैं MySQL यूनिक्स सॉकेट को कैसे निष्क्रिय कर सकता हूं?

अतिरिक्त जानकारी: मैं चल रहा हूँ MySQL 5.1पर ubuntu 10.04

प्रश्न पर पहले
से ही बहुत से लोगों ने सुझाव दिया कि नेटवर्क सॉकेट को सक्षम करने के लिए मैं अपने प्रश्न को स्पष्ट करना चाहूंगा कि बाइंड पता पहले से ही सक्षम था bind-address = 127.0.0.1और एक सुनने का कनेक्शन उपलब्ध है:

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      15601/mysqld 

फिर भी मुझे 127.0.0.1:3306अपने वेबएप (Drupal वेबसाइट) से आने के लिए कोई कनेक्शन प्रयास नहीं दिखता ।

उत्तर के साथ अपडेट किया गया

यह वास्तव में प्रतीत होता है कि मुद्दा mysqliकनेक्टर से आ रहा है जो ड्रुपल उपयोग करता है ( .ht_config.phpउन लोगों के लिए जो रुचि रखते हैं)। इसे सेट किया गया था: फिक्स्ड इश्यू में mysqli://drupal:***@localhost/drupalबदल localhostजाना 127.0.0.1(यानी द्रुपाल अब नेटवर्क सॉकेट से कनेक्शन बना रहा है)।

जवाबों:


52

IP- बाइंडिंग का उपयोग करें 127.0.0.1। उस पर एक श्रवण पोर्ट को सक्रिय करना चाहिए localhost। ग्राहक की ओर का उपयोग नहीं करते हैं localhost- 127.0.0.1इसके बजाय का उपयोग करें । कई क्लाइंट के पास एक आंतरिक उपनाम है जो उन्हें localhostलक्ष्य के रूप में निर्दिष्ट करने पर सॉकेट से कनेक्ट करता है ।

MySQL अजीब है।


6
बस उपयोग करें --protocol.. जोनाथन का जवाब देखें।
पचेरियर

75

लिनक्स और अन्य * निक्स में, MySQL मान जाएगा कि आप सॉकेट का उपयोग करना चाहते हैं यदि आप होस्ट "लोकलहोस्ट" (जो कि डिफ़ॉल्ट होस्टनाम होगा) से कनेक्ट होते हैं।

आप इसे 3 तरीकों से ओवरराइड कर सकते हैं: 1) 127.0.0.1 ( mysql -h 127.0.0.1) या अपने सर्वर के असली होस्टनाम 2 की तरह एक अलग होस्टनाम निर्दिष्ट करें। निर्दिष्ट करें कि आप टीसीपी का उपयोग करना चाहते हैं न कि सॉकेट ( mysql --protocol tcp)।

आप यह भी आसानी से कर सकते हैं कि डिफ़ॉल्ट मेरे संपादन my.cnf तो यह यह ([ग्राहक] किसी भी ग्राहक का मतलब है:

[client]
protocol=tcp

MySQL कैसे तय करती है, इसका पूरा विवरण आप यहाँ देख सकते हैं:

http://dev.mysql.com/doc/refman/5.5/en/connecting.html


6
यह स्वीकृत उत्तर होना चाहिए।
पचेरियर

क्या डॉकटर कंटेनर के अंदर MySQL सर्वर को डॉकटर-कंपोजर के साथ कंटेनर नाम के उपयोग के साथ चलाया जाता है क्योंकि इसका होस्ट नाम सॉकेट प्रोटोकॉल पर नेटवर्क प्रोटोकल के उपयोग को मजबूर करता है?
स्टीफन

रक्षात्मक रूप से स्वीकृत उत्तर होना चाहिए। तरीका 3 (प्रोटोकॉल = my.cnf में tcp) एकमात्र तरीका है जो बिना किसी अतिरिक्त कमांड लाइन पैरामीटर के काम करता है इसलिए किसी भी स्क्रिप्ट में बदलाव के बिना काम करता है।
टुनके गोनकुओलू

16

क्या यह वास्तव में ग्राहक समस्या नहीं है? यदि mysql प्रोग्राम का उपयोग कर रहे हैं, तो आप --protocolस्विच का उपयोग कर सकते हैं । मैन पेज से

 --protocol={TCP|SOCKET|PIPE|MEMORY}

       The connection protocol to use for connecting to the server. It is
       useful when the other connection parameters normally would cause a
       protocol to be used other than the one you want. For details on the
       allowable values, see Section 4.2.2, “Connecting to the MySQL
       Server”.

मैंने बस कोशिश की

mysql --protocol=TCP -u root -p

जब tcpdump -i lo tcp port 3306मैं सिर्फ दौड़ता हूं तो मॉनिटरिंग पोर्ट 3306 और मैं ट्रैफिक देख सकता हूं

mysql  -u root -p

मैं (सही ढंग से) पोर्ट 3306 पर कोई ट्रैफ़िक नहीं देखता।

संपादित करें:

अब जब आप हमें बताते हैं कि आप DRUPAL का उपयोग कर रहे हैं, तो समाधान अपेक्षाकृत आसान है।

फ़ाइल पर जाएं sites/<sitename>या उसे sites/defaultसंपादित करेंsettings.php

आपको इस तरह की संरचना मिलेगी

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'databasename',
      'username' => 'databaseuser',
      'password' => 'databasepassword',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

फ़ाइल 'localhost'को बदलें '127.0.0.1'और सहेजें।


यह वास्तव में एक क्लाइंट इश्यू द्वारा हो सकता है लेकिन चूंकि क्लाइंट एक वेब एप्लिकेशन (Drupal) है और इस पर मेरा कोई नियंत्रण नहीं है इसलिए मैं इसे सिस्टम के दृष्टिकोण से मजबूर करने का तरीका ढूंढ रहा था।
मैक्स

1
यह कहकर कि no controlमैं नाटकीय था। मैं .ht_config.phpफ़ाइल को संशोधित कर सकता हूं और समस्या को ठीक कर सकता हूं।
मैक्स

एक बालक नाटकीय रूप से, लेकिन यह एक ग्राहक मुद्दा है और इसे आसानी से हल किया जाता है। मेरा संपादन देखें।
user9517

क्षमा करें, मैंने अपनी टिप्पणी जोड़ने के बाद अपने प्रश्न को उत्तर के साथ अद्यतन किया। किसी कारण से हम .ht_config.phpइसके बजाय उपयोग कर रहे हैं settings.php। मैं नहीं जानता कि क्यों (देव टीम ने अनुरोध किया कि इसे इस तरह होना चाहिए)। अब मुद्दा यह है कि ड्रुपल .ht_config.phpहर अनुरोध पर फ़ाइल को पढ़ता हुआ प्रतीत होता है (क्योंकि यदि मैं इसे बदलता हूं, तो परिवर्तनों को तुरंत ध्यान में रखा जाता है) जो प्रदर्शनों में मदद नहीं कर सकता है। हम उन सेटिंग्स को एप्लिकेशन लेयर पर कैश करने का तरीका ढूंढ रहे हैं लेकिन यह एक अलग समस्या है।
मैक्स

नोट: आप नहीं कर सकते हैं --protocol=socketयदि आपके पास hostइसके [client]अनुभाग में कोई प्रविष्टि है तो .my.cnfयह wrong or unknown protocolत्रुटि देता है। (mysql 5.7.13)
क्रिस

1

यह थोड़ा पागल लग सकता है

सॉकेट फ़ाइल को एक पूर्ण पथ पर सेट करने का प्रयास करें जिसका पथ किसी अन्य मशीन पर रहता है

http://dev.mysql.com/doc/refman/5.0/en/server-options.html#option_mysqld_socket

अन्यथा, आप इस डिफ़ॉल्ट व्यवहार को दरकिनार नहीं कर सकते क्योंकि mysqld के साथ संवाद करने के लिए एक सॉकेट फ़ाइल मौजूद होनी चाहिए।


1

My.cnf को संपादित करें और निर्देश जोड़ें

bind-address = 127.0.0.1

या आपके पसंदीदा IP को नेटवर्क पर पहुँच योग्य बनाने के लिए। यह काम पाने के बाद mysql को पुनरारंभ करें।


1

जब आप NULL मान या स्ट्रिंग "लोकलहोस्ट" ( http://www.php.net/manual/en/mysqli.construct.php ) में पास करते हैं तो php mysqli क्लाइंट tcp नेटवर्क के बजाय यूनिक्स सॉकेट फ़ाइल का उपयोग करेगा

ऐसा लगता है कि sqlyog क्लाइंट हमेशा tcp नेटवर्क का उपयोग तब भी करता है जब आप उसमें "लोकलहोस्ट" भरते हैं


0

मुझे /etc/my.cnf को हटाना पड़ा (इसे वापस करने के बाद), फिर सर्वर को पुनः आरंभ किया। तब मैं एक सॉकेट के साथ जुड़ सकता था और त्रुटि गायब हो गई थी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.