MySQL "लोकलहोस्ट" के माध्यम से कनेक्ट नहीं हो सकता है, केवल 127.0.0.1


27

यह कुछ हद तक मेरे लिए एक रहस्य है। जिस तरह से मैं MySQL से जुड़ सकता हूं, अगर मैं इसे "127.0.0.1" के माध्यम से कॉल करता हूं ... उदाहरण के लिए, मेरी PHP कनेक्ट स्क्रिप्ट स्थानीयहोस्ट के साथ काम नहीं करेगी।

मैं मैक ओएस एक्स लॉयन, अंतर्निहित Apache2, MySQL, PHP, phpMyAdmin चला रहा हूं

mysqladmin:

count                             0
debug-check                       FALSE
debug-info                        TRUE
force                             FALSE
compress                          FALSE
character-sets-dir                (No default value)
default-character-set             auto
host                              (No default value)
no-beep                           FALSE
port                              0
relative                          FALSE
socket                            (No default value)
sleep                             0
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
user                              (No default value)
verbose                           FALSE
vertical                          FALSE
connect-timeout                   43200
shutdown-timeout                  3600
plugin-dir                        (No default value)
default-auth                      (No default value)

1
यह संभवतः सर्वर फॉल्ट के लिए अधिक है, लेकिन सुनिश्चित करें कि आपकी होस्ट फ़ाइल में लोकलहोस्ट उर्फ ​​है।
मैट

127.0.0.1 लोकलहोस्ट मेरी होस्ट फ़ाइल में है।
डॉक्यूम्बस

कमांड प्रॉम्प्ट खोलें और टाइप करें ping localhostऔर देखें कि यह क्या कहता है।
स्टीव रॉबिंस

127.0.0.1 से 64 बाइट्स: icmp_seq = 0 ttl = 64 समय = 0.100 ms 64 बाइट 127.0.0.1 से: icmp_seq = 1 ttl = 64 समय = 0.102 एमएस 64 बाइट 127.0.0.1 से: icmp_seq = 2 ttl = 64 समय = 0.096 एमएस
डॉक्यूम्बस

जवाबों:


26

यदि आप इसे "लोकलहोस्ट" से कनेक्ट करने के लिए कहते हैं तो MySQL यूनिक्स सॉकेट से कनेक्ट करने का प्रयास करेगा। यदि आप इसे 127.0.0.1 से कनेक्ट करने के लिए कहते हैं, तो आप इसे नेटवर्क सॉकेट से कनेक्ट करने के लिए मजबूर कर रहे हैं। तो शायद आपने MySQL को केवल नेटवर्क सॉकेट को सुनने के लिए कॉन्फ़िगर किया है न कि फाइल सिस्टम सॉकेट में।

आपके यूनिक्स सॉकेट में क्या गलत है, यह बताना मुश्किल है। लेकिन मैं आपको MySQL संदर्भ गाइड पर इस पृष्ठ को पढ़ने की सलाह देता हूं । इससे आपको मदद मिलनी चाहिए।

अद्यतन: अद्यतन किए गए प्रश्न के आधार पर: पैरामीटर "सॉकेट" कुछ इस तरह होना चाहिए: "/var/lib/mysql/mysql.sock"। संदर्भ पुस्तिका के इस पृष्ठ में कुछ और जानकारी है।

यहां आपके पास मेरी /etc/my.cnf फ़ाइल की शुरुआत है:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

आपकी फ़ाइल समान होनी चाहिए। तब आपकी समस्या का समाधान होना चाहिए। परीक्षण करने से पहले MySQL सर्वर को पुनरारंभ करना न भूलें।


1
Wow: "यदि आप एक होस्ट नाम निर्दिष्ट नहीं करते हैं या यदि आप विशेष होस्ट नाम लोकलहोस्ट निर्दिष्ट करते हैं तो एक यूनिक्स सॉकेट फ़ाइल का उपयोग किया जाता है।" ऐसा लगता है ... अनपेक्षित। इसलिए अन्य सभी उत्तर।
मार्क वैगनर

1 को जानने के लिए अच्छा है
मैट

मैं सिद्धांत की सराहना करता हूं ... बस यह नहीं जानता कि उत्तर क्या है।
dcolumbus

@ कोलकोम्बस: जैसा कि मैंने पहले ही लिखा था कि यह बताना मुश्किल है। मैं आपको जो सलाह दे सकता हूं वह एक कंसोल खोलने के लिए है और बस कमांड "mysql" लिखें। शायद आपको अधिक जानकारी मिल जाए। एक और बात लॉग फ़ाइल में देखना है। मेरा निर्देशिका / var / log / में स्थित है और इसे mysql.log कहा जाता है। आपका दूसरा नाम या कोई अन्य स्थान हो सकता है। यदि आप हमें अधिक जानकारी प्रदान कर सकते हैं तो हम आपकी बेहतर मदद कर सकते हैं।
राफेल लुथिगर

2
php.ini में "/var/mysql/mysql.sock" (3 स्थान सटीक होने का संदर्भ) है जिसे "/tmp/mysql.sock" में बदलने की आवश्यकता है ... आपकी मदद के लिए धन्यवाद!
22

8

आपके पास IPv6 सक्षम हो सकता है, इसका बहुत ही संभावित लोकलहोस्ट IPv6 लोकलहोस्ट के लिए संकल्पित है, जो आपके msqf config में परिभाषित नहीं है।

ive में एक समस्या भी थी, जहाँ मुझे उस उपयोगकर्ता के लिए अनुमत सबनेट्स में '127.0.0.1' के स्थान पर 'लोकलहोस्ट' जोड़ना था, समझ में नहीं आया कि क्यों (मैं ipv4 का उपयोग कर रहा था और यह कुछ समय पहले हुआ था), लेकिन इसकी एक कोशिश थी।


आप यह देख कर देख सकते हैं कि कमांड लाइन पर 'होस्ट लोकलहोस्ट' की वापसी :: 1 और साथ ही 127.0.0.1 है। यदि ऐसा है, तो आप IPv6 :: 1 पते के साथ-साथ 127.0.0.1
डेविड नॉर्थ

मुझे लगता है कि मुझे यह याद है कि मैक ओएस एक्स पर डिफ़ॉल्ट रूप से आईपीवी 6 सक्षम है ... क्या यह मामला है?
डोलकुम्बस

IPv6 को इन दिनों बहुत सारे आधुनिक OS के लिए सक्षम किया गया है, osx10.6 पर im और डिफ़ॉल्ट रूप से इसे सक्षम किया गया है।
सिल्वरफायर

गलत। बाहर की जाँच करें - स्थानीय होस्ट mysql ग्राहकों के लिए विशेष अर्थ नहीं है serverfault.com/a/295300/67675
poige

5

मेरे लिए, OSX के बिलिन php को homebrew के mysql से अलग यूनिक्स-सॉकेट का उपयोग करने के लिए कॉन्फ़िगर किया गया है। इस प्रकार यह लोकलहोस्ट के माध्यम से कनेक्ट नहीं हो सकता है जो उस सॉकेट का उपयोग करता है।

मैं इसे एक त्वरित हैक के साथ नियत करता हूं, जो कि एक mysql वास्तव में उपयोग करने के लिए इंगित करने के लिए php के कॉन्फ़िगर सॉकेट-पाथ से मेल खाता है।

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

निम्नलिखित नैदानिक ​​आदेश बहुत मददगार थे।

Php और mysql द्वारा उपयोग किए जाने वाले डिफ़ॉल्ट सॉकेट-पथ की जाँच करें:

php -i | fgrep 'mysql.default_socket'
mysql -e 'show variables where variable_name = "socket"'

निर्दिष्ट सॉकेट का उपयोग करके कनेक्ट करें:

php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "user", "pass"));'
mysql --socket=/tmp/mysql.sock

निर्धारित करें कि कनेक्ट करने के लिए किस प्रकार का सॉकेट mysql क्लाइंट का उपयोग कर रहा है:

lsof | egrep '^mysql .*(IPv|unix)'

2

क्या आप देख सकते हैं mysql/conf/my.conf(निर्देशिका संरचना बहुत ज्यादा OSx पर ही होनी चाहिए) यह देखने के लिए कि क्या skip-networkingयह अप्रतिबंधित है? यदि ऐसा है, तो #लाइन के सामने एक जोड़ दें और mysql- सर्वर को पुनरारंभ करें।

मैं वास्तव में थोड़ी देर पहले एक समान मुद्दा था (हालांकि यह OSx में नहीं था), इसलिए मुझे लगा कि यह शॉट के लायक हो सकता है।


1
यह क्यों घट गया? एक स्पष्टीकरण सहायक होगा।
कार्लिंडमार्क

मैंने आपको वोट नहीं दिया, लेकिन आपका जवाब वास्तव में ओपी से पूछ रहा है। लेकिन मैंने आपको उल्टा कर दिया क्योंकि मैं विपरीत स्थिति से जूझ रहा था - एक सॉकेट के माध्यम से जुड़ा होगा, लेकिन नेटवर्क के माध्यम से नहीं। वैसे, मैं COULD को इसके माध्यम से ठीक नहीं करता हूं ।conf; मुझे इसे कमांड लाइन पर रखना था: "mysqlf --skip_networking = 0 ..."
Jan Steinman

2

PHP अभी भी डिफ़ॉल्ट सॉकेट स्थान का उपयोग करने की कोशिश कर रहा है। यदि आप MariaDB / MySQL फ़ोल्डर को / var / lib / mysql से किसी अन्य स्थान पर ले गए हैं तो यह समस्या दिखाई दे सकती है । समस्या को हल करने के लिए आपको /etc/php.ini फ़ाइल में नए सॉकेट के स्थान को परिभाषित करना होगा ।

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

यह देखें कि आप किस ड्राइवर का उपयोग करते हैं, इसके आधार पर आपको pdo_mysql.default_socket = निर्दिष्ट करना पड़ सकता है !

अपनी वर्तमान निर्देशिका की जाँच करने के लिए mysql में निम्न कमांड चलाएँ:

select @@datadir;

1

क्या लोकलहोस्ट आपकी /private/etc/hostsफाइल में परिभाषित है ?


127.0.0.1 लोकलहोस्ट मेरी होस्ट फ़ाइल में है।
डॉक्यूम्बस

4
/private? इससे पहले कभी नहीं देखा
TheLQ

@ THELQ: यह एक मैक बात है। जबकि वहाँ है : से एक सिमलिंक / आदि / निजी / आदि, किसी कारण एप्पल आम तौर पर "सही" पथ का उपयोग की सलाह है के लिए support.apple.com/kb/TA27291
जस्टिन ᚅᚔᚈᚄᚒᚔ

1

मैं अपने परीक्षण बॉक्स पर आपके समान लक्षणों को फिर से बनाने में सक्षम था, उम्मीद है कि इससे मदद मिलेगी।

MySQL में, उपयोगकर्ताओं को दो भागों (नाम और होस्ट) द्वारा परिभाषित किया गया है। डिफ़ॉल्ट रूप से, MySQL में 3 रूट उपयोगकर्ता होंगे:

mysql> SELECT host,user,password FROM mysql.user WHERE user='root';
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root |                                           |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root | *PASSWORD_HASH_GOES_HERE                  |
+-----------------------+------+-------------------------------------------+

पासवर्ड फ़ील्ड या तो रिक्त होगी (कोई पासवर्ड नहीं) या उसके पास कोई हैश संग्रहीत हो। यदि आप एक विशिष्ट उपयोगकर्ता के लिए पासवर्ड सेट करते हैं, तो यह स्वचालित रूप से सभी को अपडेट नहीं करता है, क्योंकि MySQL उन्हें विभिन्न उपयोगकर्ताओं के रूप में देखता है।

उदाहरण के लिए:

mysql> set password for 'root'@'127.0.0.1' = password('Password');

के लिए पासवर्ड अपडेट करेगा 'root'@'127.0.0.1', लेकिन नहीं 'root'@'localhost'या नहीं'root'@'localhost.localdomain'

skip_name_resolveचर पर एक नज़र डालें :

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

डिफ़ॉल्ट रूप से skip_name_resolveहै OFF, और होस्टनाम के सभी आईपी पते को हल करने का प्रयास करेगा। उदाहरण के लिए, यदि आप के रूप में कनेक्ट करते हैं 'root'@'127.0.0.1', तो MySQL आपको कनेक्ट के रूप में बदल देगा 'root'@'localhost'

अगर ऐसा है ON, MySQL देख सकते हैं और कनेक्ट करेगा 'root'@'127.0.0.1'और 'root'@'localhost'अलग उपयोगकर्ताओं के रूप में। और उनके पास अलग-अलग पासवर्ड हो सकते हैं या नहीं, यह इस बात पर निर्भर करता है कि वे कैसे सेट किए गए थे।


इसलिए पहले, मैं कोई भी पासवर्ड अंतर देखने के लिए जाँच करूँगा: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

यदि वहाँ हैं, तो आप उन्हें ठीक कर सकते हैं, या आप जांच जारी रख सकते हैं।

तो मैं जाँच करेगा skip_name_resolve: mysql> show variables like 'skip_name_resolve';

यदि यह है ON, तो मुझे पता चलेगा कि यह कहाँ सेट किया जा रहा है (उदाहरण के लिए /etc/my.cnf) और इसे हटा दें, जब तक कि इसके लिए कोई आवश्यकता न हो।

उम्मीद है कि यह आपकी मदद करता है!


1

मुझे यह समस्या आ रही थी और मैं इसका पता नहीं लगा सका। मैंने बिना किसी लाभ के सब कुछ ठीक करने की कोशिश की।

मैंने पाया कि मेरे पास .net / in / root / जिसमें इसकी जानकारी थी।

मैंने इसे हटा दिया और समस्या चली गई।

अब मुद्दे के बिना mysql -uroot -p का उपयोग करके mysql में लॉग इन करने में सक्षम।

मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन आशा है कि इससे किसी को मदद मिलेगी।


1

मेरे लिए, mysql.sock की मूल निर्देशिका पर पारंपरिक रूप से पठनीय होने की अनुमतियों को बदलना इस मुद्दे को तय करता है:

chmod 755 /var/lib/mysql

1

CloudLinux के साथ CageFS का उपयोग करने वाले लोगों के लिए:

मैंने फिर से बनाया /var/lib/mysqlक्योंकि मैं खरोंच से MySQL सर्वर का पुनर्निर्माण कर रहा था ...

जो पिंजरे से रास्ता नहीं निकालता है। मुझे पता है कि यह असंबंधित है, लेकिन मैं cPanel और CloudLinux का उपयोग कर रहा था। मैं सत्यापित नहीं कर सका कि सॉकेट कनेक्शन काम क्यों नहीं करेगा, और आखिरकार, मुझे एहसास हुआ।

जोड़ने /var/lib/mysqlके लिए /etc/cagefs/cagefs.mp (यदि पहले से ही वहाँ अगले चरण पर जाएं) और चल

cagefsctl --remount-all

समस्या को ठीक किया


1
हे भगवान! यह वही है जो मेरे लिए तय हो गया है! यह पहले से ही /etc/cagefs/cagefs.mpचल रहा था लेकिन cagefsctl --remount-allइसे तय किया गया था। धन्यवाद दोस्त!
अल्वारो फ्लान्सो लैर्रोनडो

0

आपको इसे निजी / आदि / मेजबानों में परिभाषित करना होगा जो मुझे लगता है ... या बस 127.0.0.1 का उपयोग करें क्योंकि यह किसी भी तरह एक ही चीज है, बस एक उपनाम।


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