MySQL “localhost” üzerinden bağlanamaz, yalnızca 127.0.0.1


27

Bu benim için biraz gizemli. MySQL'e bağlanabilmemin tek yolu "127.0.0.1" üzerinden çağırmam ... örneğin, PHP connect betiğim localhost ile çalışmayacak

Mac OS X Lion, dahili apache2, MySQL, PHP, phpMyAdmin kullanıyorum

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
Bu muhtemelen Sunucu hatası için daha fazladır, ancak hosts dosyanızın yerel ana bilgisayar takma adına sahip olduğundan emin olun.
Matt,

127.0.0.1 localhost ana bilgisayarımın dosyasında.
dcolumbus

Komut istemini açın ping localhostve ne yazdığını görün.
Steve Robbins,

127.0.0.1'den 64 bayt: icmp_seq = 0 ttl = 64 saat = 0.100 ms 64.0.0.1'den 64 bayt: icmp_seq = 1 ttl = 64 saat = 0.102 ms ms
dcolumbus

Yanıtlar:


26

MySQL, eğer "localhost" a bağlanmasını söylerseniz, unix soketine bağlanmaya çalışacaktır. 127.0.0.1'e bağlanmasını söylerseniz, onu ağ soketine bağlanmaya zorlarsınız. Muhtemelen MySQL, sadece ağ soketini dinleyecek ve dosya sistemi soketini dinleyecek şekilde yapılandırılmadı.

Unix soketinizde tam olarak neyin yanlış olduğunu söylemek zordur. Ancak bu sayfayı MySQL referans kılavuzunda okumanızı tavsiye ederim . Bu sana yardım etmeli.

GÜNCELLEME: Güncellenmiş soruyu temel alarak: "soket" parametresi şöyle olmalıdır: "/var/lib/mysql/mysql.sock". Referans El Kitabındaki bu sayfa biraz daha fazla bilgiye sahiptir.

Burada /etc/my.cnf dosyamın başlangıcına sahipsiniz:

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

Dosyanız benzer olmalıdır. O zaman sorunun çözülmeli. Test etmeden önce MySQL sunucusunu yeniden başlatmayı unutmayın.


1
Vay: "Bir ana bilgisayar adı belirtmezseniz ya da özel ana bilgisayar adı localhost belirtirseniz bir Unix soket dosyası kullanılır." Bu ... sezgisel görünüyor. Dolayısıyla diğer tüm cevaplar.
Mark Wagner,

Bu bilmek iyi +1
Matt

Teoriyi takdir ediyorum ... sadece cevabın ne olduğunu bilmiyorum.
dcolumbus

@dcolumbus: Zaten yazdığım gibi anlatması zor. Size önerebileceğim bir konsol açmak ve sadece "mysql" komutunu yazmak. Belki o zaman daha fazla bilgi edinebilirsin. Diğer bir şey de günlük dosyasına bakmaktır. Mine / var / log / dizininde bulunur ve mysql.log olarak adlandırılır. Seninkilerin başka bir adı veya başka bir konumu olabilir. Bize daha fazla bilgi verebilirseniz, muhtemelen size daha iyi yardımcı olabiliriz.
Raffael Luthiger

2
php.ini "/var/mysql/mysql.sock" ("tam 3 yer") olan "/tmp/mysql.sock" olarak değiştirilmesi gereken referanslara sahiptir ... Yardımlarınız için teşekkürler!
dcolumbus

8

IPv6'yı etkinleştirmiş olabilirsiniz, çok muhtemel localhost, msql konfigürasyonunuzda tanımlanmayan ipv6 localhost'a gider.

Ayrıca, bu kullanıcının izin verilen alt ağlarına '127.0.0.1' yerine 'localhost' eklemek zorunda kaldığım bir problemi var, neden (ipv4 kullanıyordum ve bir süre önceydi) ama denemeye değer değil.


Bunu, komut satırında 'host localhost' komutunun :: 1 ve 127.0.0.1 döndürdüğünü kontrol ederek kontrol edebilirsiniz. Öyleyse, :: 1 eşlemesini / private / etc / hosts dizininden kaldırabilir veya MySQL'i IPv6 :: 1 adresini ve 127.0.0.1
David North

Sanırım IPv6'nın varsayılan olarak Mac OS X'te etkinleştirildiğini bir yerde okuduğumu hatırladım ... öyle mi?
dcolumbus

ipv6 bugünlerde tüm işletim sistemlerinde hemen hemen etkin, osx10.6'da ve varsayılan olarak etkin.
Silverfire

yanlış. Localhost, mysql istemciler için özel bir anlama sahiptir - serverfault.com/a/295300/67675
adresini ziyaret

5

Benim için, OSX'in yerleşik php'si, homebrew mysql'den farklı bir unix-soket kullanacak şekilde yapılandırılmış. Böylece o soketi kullanan localhost üzerinden bağlanamaz.

Php'ın yapılandırılmış soket-yolunu işaretleyerek, gerçekten kullanılan bir mysql'i işaret etmek için hızlıca kesmekle düzelttim.

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

Aşağıdaki teşhis komutları çok yardımcı oldu.

Php ve mysql tarafından kullanılan varsayılan soket yollarını kontrol edin:

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

Belirtilen bir soket kullanarak bağlanın:

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

Bağlanmak için ne tür bir soket mysql istemcisinin kullanılacağını belirleyin:

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

2

mysql/conf/my.confEğer skip-networkinguncommented olup olmadığını görmek için kontrol edebilir misiniz (dizin yapısı hemen hemen OSx'te aynı olmalı) ? Öyleyse #, satırın önüne bir satır ekleyin ve mysql sunucusunu yeniden başlatın.

Aslında bir süre önce benzer bir sorun yaşadım (bu OSx'te olmamasına rağmen), bu yüzden çekime değeceğini düşündüm.


1
Bu neden indirildi? Bir açıklama faydalı olacaktır.
karllindmark

Sana aşağı oy vermedim, ama cevabın aslında OP'nin sorduğu şeyin tam tersi Ama ben seni çok kızdırdım çünkü tam tersiyle mücadele ettim - bir prizden bağlanır, ama network üzerinden değil. Bu arada, bunu my.conf ile düzeltemedim; Komut satırına koymak zorunda kaldım: "mysqlf --skip_networking = 0 ..."
Jan Steinman

2

PHP hala varsayılan soket konumunu kullanmaya çalışıyor. Eğer varsa bu sorun ortaya çıkabilir mariadb / MySQL klasörü taşındı gelen / var / lib / mysql başka bir yere. Sorunu çözmek için /etc/php.ini dosyasındaki yeni soketin yerini tanımlamanız gerekir .

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

Kullandığınız sürücüye bağlı olarak, pdo_mysql.default_socket = ! Belirtmeniz gerekebilir .

Geçerli dizininizi kontrol etmek için mysql'de şu komutu çalıştırın:

select @@datadir;


1

Aynı belirtilerinizi test kutumda yeniden oluşturabildim, umarım bu yardımcı olacaktır.

MySQL'de kullanıcılar iki bölümle tanımlanır (ad ve ana bilgisayar). Varsayılan olarak, MySQL 3 root kullanıcısına sahip olacaktır:

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                  |
+-----------------------+------+-------------------------------------------+

Şifre alanı boş (şifre yok) veya saklanmış bir karma değerine sahip olacaktır. Şifreyi belirli bir kullanıcı için belirlerseniz, otomatik olarak tümünü güncellemez, çünkü MySQL bunları farklı kullanıcılar olarak görür.

Örneğin:

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

parolasını günceller 'root'@'127.0.0.1', ancak 'root'@'localhost'ya'root'@'localhost.localdomain'

skip_name_resolveDeğişkene bir göz atın :

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

Varsayılan skip_name_resolveolarak OFF, ve tüm IP Adreslerini ana bilgisayar adlarında çözmeyi dener. Örneğin, bağlantı kurarsanız 'root'@'127.0.0.1', MySQL bağlantı kurar 'root'@'localhost'.

Eğer öyleyse ON, MySQL görecek ve bağlanacak 'root'@'127.0.0.1've 'root'@'localhost'ayrı kullanıcılar olarak bağlanacaktır . Ve nasıl ayarlandıklarına bağlı olarak farklı şifreleri olabilir veya olmayabilir.


İlk önce, herhangi bir şifre farkını görmek için kontrol edeceğim: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

Varsa, bunları düzeltebilir veya araştırmaya devam edebilirsiniz.

Sonra kontrol ederdim skip_name_resolve: mysql> show variables like 'skip_name_resolve';

Öyleyse ON, nerede ayarlandığını (örneğin /etc/my.cnf) öğrenir ve buna gerek olmadıkça kaldırırım.

Umarım bu size yardımcı olur!


1

Bu sorunu yaşıyordum ve çözemedim. Elimden gelenin en iyisini yapmaya çalıştım.

Ben / root / içinde bilgi olan bir .netrc olduğunu buldum.

Ben sildim ve sorun gitti.

Şimdi sorun olmadan mysql -uroot -p kullanarak mysql oturum açmak mümkün.

Bunun eski bir yazı olduğunu biliyorum, ancak bunun birine yardımcı olacağını umuyorum.


1

Benim için, mysql.sock öğesinin ana dizininde genel olarak okunabilecek izinleri değiştirmek sorunu çözdü:

chmod 755 /var/lib/mysql

1

CloudLinux ile CageFS kullanan kişiler için:

/var/lib/mysqlYeniden yarattım çünkü MySQL sunucusunu sıfırdan inşa ediyordum ...

hangi yolların kafeslerden kaldırıldığı. İlişkisi olmadığını biliyorum ama cPanel ve CloudLinux kullanıyordum. Soket bağlantısının neden işe yaramadığını doğrulayamadım ve sonunda anladım.

ekleyerek /var/lib/mysqliçin /etc/cagefs/cagefs.mp (bir sonraki adıma orada devam zaten varsa) ve koşma

cagefsctl --remount-all

sorunu çözdü


1
AMAN TANRIM! Bu benim için düzeltti! Zaten içerideydi /etc/cagefs/cagefs.mpama koşmak cagefsctl --remount-alldüzeltildi. Teşekkürler dostum!
Alvaro Flaño Larrondo

0

Özel / etc / hosts dosyasında tanımlamanız gerekir ... ya da sadece 127.0.0.1 kullanın, çünkü bu zaten aynı şey, sadece takma ad.


127.0.0.1 localhost ana bilgisayarımın dosyasında.
dcolumbus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.