'/Tmp/mysql.sock soketi üzerinden yerel MySQL sunucusuna bağlanılamıyor


126

Test paketim sırasında yerel bir MySQL sunucusuna bağlanmaya çalıştığımda, şu hatayla başarısız oluyor:

OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")

Ancak, komut satırı mysqlprogramını çalıştırarak her zaman MySQL'e bağlanabiliyorum . A ps aux | grep mysql, sunucunun çalıştığını gösterir ve stat /tmp/mysql.socksoketin var olduğunu doğrular. Ayrıca, exceptbu istisnanın cümlesinde bir hata ayıklayıcı açarsam, tam olarak aynı parametrelerle güvenilir bir şekilde bağlanabilirim.

Bu sorun oldukça güvenilir bir şekilde yeniden üretiliyor, ancak% 100 gibi görünmüyor, çünkü mavi ayda bir, test paketim aslında bu hataya çarpmadan çalışıyor. Onunla koşmaya çalıştığımda sudo dtrussçoğalmadı.

Tüm istemci kodu Python'da, ancak bunun ne kadar alakalı olacağını anlayamıyorum.

Ana bilgisayarı kullanmaya geçmek 127.0.0.1şu hatayı oluşturur:

DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)

1
Veritabanına birçok eşzamanlı bağlantıyla bir şekilde ulaşmanız mümkün mü? Belki max_connectionsMySQL conf dosyanızda artırmayı deneyin ?
dgel

2
yapar mysql -h 127.0.0.1komut ile işi? Mysql sunucunuzun aslında bir TCP bağlantı noktasını dinlediğinden pek emin değilim.
Eli

1
MySQL sürümünüz için Python MySQL istemci kitaplıklarının doğru sürümlerine sahip olduğunuzdan emin misiniz? Ayrıca mysql -h localhostgüvenilir bir şekilde çalışıyor mu?
Old Pro

2
MySQL hata günlüğüne herhangi bir şey kaydeder mi? Ayrıca, /tmp/mysql.sock ve mysql veri dizininizdeki dosya izinlerini kontrol edin. Hatalar, test paketini kök (sudo) olarak çalıştırdığınızda da oluşur mu?
Erik Cederstrand

2
Bu önerilerin çoğu, aşağıdaki yanıtımda referans verdiğim resmi MySQL referans kılavuzunda yer almaktadır. MySQL referans kılavuzu önerilerini sistematik olarak gözden geçirmek, bu önerilerden yalnızca birini veya ikisini denemek yerine, zamanı daha iyi kullanmaktır.
2013

Yanıtlar:


152
sudo /usr/local/mysql/support-files/mysql.server start 

Bu benim için çalıştı. Ancak, bu işe yaramazsa, mysqld'nin çalıştığından emin olun ve bağlanmayı deneyin.


1
2 haftadan fazla zaman geçirdim (şaka bile yapmıyorum) ve bu nihayet bağlanabilmem için sahip olduğum en yakın şey. Ancak 'mysql başlatılıyor' ..... Ama teşekkürler, güzel yazı!
L. Klotz

2
sudo: /usr/local/mysql/support-files/mysql.server: komut bulunamadı. neden?
Syam Pillai

1
Neden sudodan sonra iki nokta üst üste? Yolun var olup olmadığını kontrol edin
Pratyay

Veya mysql homebrew ile kuruluysa: sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start
Majoren

1
Sunucu, PID dosyasını (/var/lib/mysql/Saranshs-MacBook-Pro.local.pid) güncellemeden çıkış yapıyor.
saran3h

90

MySQL kılavuzunun ilgili bölümü buradadır . Orada listelenen hata ayıklama adımlarını izleyerek başlayacağım.

Ayrıca, localhost ve 127.0.0.1'in bu bağlamda aynı şey olmadığını unutmayın:

  • Ev sahibi olarak ayarlanmışsa localhost , bir soket veya boru kullanılır.
  • Ana bilgisayar olarak ayarlanmışsa 127.0.0.1, istemci TCP / IP kullanmaya zorlanır.

Böylece, örneğin, veritabanınızın TCP bağlantılarını dinleyip dinlemediğini kontrol edebilirsiniz vi netstat -nlp. Muhtemelen TCP bağlantılarını dinliyor gibi görünüyor, çünkü bunun mysql -h 127.0.0.1gayet iyi çalıştığını söylüyorsunuz . Veritabanınıza soketler aracılığıyla bağlanıp bağlanamayacağınızı kontrol etmek için şunu kullanın:mysql -h localhost .

Bunların hiçbiri işe yaramazsa, muhtemelen MySQL yapılandırmanız, bağlantıyı tam olarak nasıl başlattığınız vb. Hakkında daha fazla ayrıntı göndermeniz gerekir.


Genel olarak yerleşik tanılama prosedürlerini takip etmek iyi bir fikir olsa da, soruyu (ve prosedürleri) okursanız, prosedürlerin uygulandığını ve bunun MySQL sunucusunda bir sorun olmadığını belirlediğinizi görürsünüz. Bu, özellikle Python istemcisi ile ilgili bir şeydir, çünkü soket aracılığıyla diğer tüm erişim, Python'dan diğer erişim dahil, iyi çalışır.
Old Pro

1
Ne garip bir olumsuz oy. Yerleşik prosedürü birkaç nedenden ötürü yayınladım: (1) diğer insanlar yerleşik prosedürün yalnızca bir bölümünü gönderiyorlardı ve hata ayıklama konusunda sistematik olmak daha iyi, (2) localhost ile 127.0.0.1 arasında bazı karışıklıklar var gibi görünüyordu ve (3 ) aynı "Yerel mysql sunucusuna bağlanılamıyor" belirtisine sahip diğer kişilerin bu soruyla karşılaşmaları olasıdır. Muhtemelen Python istemcisi olduğunun farkındayım, bu yüzden daha fazla bilgi istedim, örneğin bağlantının nasıl somutlaştırıldığı hakkında.
jtoberon

4
+1 mysql'e bir ssh tüneli üzerinden bağlanmaya çalışırken bu hatayı alıyorum ( localhostana bilgisayar olarak kullanarak ). Düzeltmek için değiştiriliyor 127.0.0.1.
krock

Kayıt için, bu sorunumu çözdü: "Yerel MySQL sunucusuna '/tmp/mysql.sock' soketi üzerinden bağlanılamıyor".
proinsias

Teşekkürler! bir docker maridb konteynerine bağlanmaya çalışırken bu düzeltmeyi benim için çalıştı.
Lucian Oprea

86

Benim için sorun mysql sunucusunu çalıştırmıyordum. Önce sunucuyu çalıştırın ve ardından çalıştırın mysql.

$ mysql.server start
$ mysql -h localhost -u root -p

28

Geliştiricilerimde, MySQL'in standart olmayan bir yerde kurulu olarak önceden yapılandırılmış olarak gelen MAMP gibi bir yığın yöneticisi kurulduğunda bunun mağazamda gerçekleştiğini gördüm.

senin terminal koşusunda

mysql_config --socket

bu size çorap dosyasına giden yolu verecektir. bu yolu kullanın ve VERİ TABANLARI HOST parametrenizde kullanın.

Yapman gereken şey işaret etmektir

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'test',
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',
        'PORT': '',
    },
}

NOT

Ayrıca which mysql_config, makinede bir şekilde birden fazla mysql sunucusu örneğiniz varsa, yanlış olana bağlanıyor olabilirsiniz.


Ya çorap dosyanız eksikse?
AlxVallejo

başka bir çift almak mı? j / k, mysql hizmetinin çalışmadığı anlamına gelir.
mysql'inizi

6
Benim durumumda, HOST'u "localhost" dan "127.0.0.1" e değiştirmek sorunu çözdü.
lucaswxp

@lucaswxp: Benim durumumda, yerel ana bilgisayarı alan adıyla değiştirmem gerekiyor
Anshul Mishra

19

Sadece değişti HOSTgelen localhostetmek 127.0.0.1ve iyi çalışıyor:

# settings.py of Django project
...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '',
},
...

4
Hangi dosyayı değiştirdiğinizi ve nerede olduğunu bilmek güzel olurdu
Empi

1
Gelen settings.pyprojenin.
Sirbito X

11

Ne zaman, mac OSx'te daemon mysql'nizi kaybederseniz, ancak özel / var'da örnek olarak başka bir yolda mevcutsa, aşağıdaki komutu yapın

1)

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

2) bağlantınızı mysql ile yeniden başlatın:

mysql -u username -p -h host databasename

mariadb için de çalışıyor


9

Aşağıdaki cmd'yi terminalde çalıştırın

/ Usr / local / mysql / bin / mysqld_safe

görüntü açıklamasını buraya girin

Ardından, etkili olması için makineyi yeniden başlatın. İşe yarıyor!!


1
Bu, Mojave'ye yükseltilmiş High Sierra çalıştıran bir iMac'te benim için çalıştı. Olması gereken şey mysql.sock dosyasının tmp'de olması ve yükseltme sırasında silinmesiydi. Soket, MySQL başlatıldığında otomatik olarak oluşturulduğundan, MySQL'in kapatıldığından emin olmanız ve ardından yukarıdaki gibi güvenli modda başlatmanız gerekir. Mysql.sock dosyası sihirli bir şekilde görüntülenir.
David

8

Lsof komutunu kullanarak mysql işlemi için açık dosya sayısını kontrol edin.

Açık dosya sınırını artırın ve tekrar çalıştırın.


Ben de bununla daha önce karşılaştım ve bunu .cnf dosyanız aracılığıyla yapamazsınız. aslında ulimitistemcinizin ve sunucunuzun açmasına izin verilen açık dosya sayısını artırmanız gerekebilir . ubuntu'nun yeni bir sürümündeyseniz, bu mysql upstart komut dosyasının / etc / init içinde düzenlenmesini gerektirebilir, ancak umarım bunu sadece .cnf dosyasında yapabilirsiniz.
boşalması

8

Bu çözümlerden birkaçını denedikten ve başarılı olamadıktan sonra, benim için işe yarayan şey buydu:

  1. Sistemi yeniden başlatın
  2. mysql.server başlangıcı
  3. Başarı!

7

Bu, aşağıdaki sorunlardan biri olabilir.

  1. Yanlış mysql kilidi. çözüm: Doğru mysql soketini şu şekilde bulmalısınız:

mysqladmin -p değişkenler | grep soket

ve sonra db bağlantı kodunuza ekleyin:

pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock")

/tmp/mysql.sock grep'ten döndürülür

2. Yanlış mysql bağlantı noktası çözümü: Doğru mysql bağlantı noktasını bulmanız gerekir:

mysqladmin -p variables | grep port

ve sonra kodunuzda:

pymysql.connect(db='db', user='user', passwd='pwd', host='localhost', port=3306)

3306, grep'ten döndürülen bağlantı noktasıdır

İlk seçeneğin sorununuzu çözeceğini düşünüyorum.


6

Homebrew aracılığıyla 5.7'den 8.0'a yükseltenler için, bu hata muhtemelen yükseltmenin tamamlanmamasından kaynaklanıyor. Benim durumumda mysql.server startbana şu hatayı aldım:

HATA! Sunucu, PID dosyasını güncellemeden kapanıyor

Daha sonra günlük dosyasını kontrol ettim cat /usr/local/var/mysql/YOURS.err | tail -n 50ve aşağıdakileri buldum:

InnoDB: Bir çökmeden sonra yükseltme desteklenmez.

Aynı teknedeyseniz, önce mysql@5.7homebrew aracılığıyla kurun , sunucuyu durdurun ve ardından 8.0 sistemini yeniden başlatın.

brew install mysql@5.7

/usr/local/opt/mysql@5.7/bin/mysql.server start
/usr/local/opt/mysql@5.7/bin/mysql.server stop

Sonra,

mysql.server start

Bu, MySQL'inizin (8.0) tekrar çalışmasını sağlar.


ERROR! The server quit without updating PID fileYine aynısını alıyorum .
awebartisan

Benim durumumda mysql@5.7'yi yeni yükledim ve en yenisini kaldırdım. Her şey başladı. Veri tabanı silinmedi.
Andrew Luca

4

Sanırım aynı davranışı bir süre önce görmüştüm, ancak ayrıntıları hatırlayamıyorum.
Bizim durumumuzda sorun, test çalıştırıcısının gerekli ilk veritabanı etkileşimine göre veritabanı bağlantılarını başlattığı andır; örneğin, settings.py veya bazı __init__.py içindeki bir modülü içe aktararak. Biraz daha bilgi bulmaya çalışacağım, ancak bu, vakan için şimdiden bir zil çalabilir.


4

/ Etc / hosts dosyanızın içinde olduğundan ve düzgün 127.0.0.1 localhostçalıştığından emin olun


Şaşırtıcı bir şekilde (saygıyla) bu benim için sıraladı - bunu kontrol ederken, webdav'ı kurmaya çalışırken Mavericks'in ana bilgisayar dosyama bazı ek (tamamen bozuk) satırlar eklediğini - localhost'u yeniden atayan biri de dahil olmak üzere - buldum.
rob_was_taken

4

Bu konuda iki sinsi varsayım var

KONJEKTÜR # 1

/tmp/mysql.sockDosyaya erişememe olasılığını araştırın . MySQL veritabanlarını kurduğumda, normalde soket dosyası sitesinin içeri girmesine izin veriyorum /var/lib/mysql. Mysql'de olarak oturum açarsanız root@localhost, işletim sistemi oturumunuzun /tmpklasöre erişmesi gerekir . /tmpİşletim sisteminde doğru erişim haklarına sahip olduğunuzdan emin olun . Ayrıca, sudo kullanıcısının her zaman içindeki dosyayı okuyabildiğinden emin olun /tmp.

KONJEKTÜR # 2

Mysql'e erişim 127.0.0.1 , eğer dikkat etmiyorsanız bazı karışıklıklara neden olabilir. Nasıl?

Komut satırından MySQL'e ile bağlanırsanız 127.0.0.1, TCP / IP protokolünü belirtmeniz gerekebilir.

mysql -uroot -p -h127.0.0.1 --protocol=tcp

veya DNS adını deneyin

mysql -uroot -p -hDNSNAME

Bu, olarak oturum açmayı atlayacaktır root@localhost, ancak root@'127.0.0.1'tanımladığınızdan emin olun .

MySQL'e bir sonraki bağlanışınızda şunu çalıştırın:

SELECT USER(),CURRENT_USER();

Bu sana ne veriyor?

  • USER (), MySQL'de nasıl kimlik doğrulamaya çalıştığınızı bildiriyor
  • CURRENT_USER (), MySQL'de kimlik doğrulaması yapmanıza nasıl izin verildiğini bildiriyor

Bu işlevler aynı değerlerle dönerse, beklendiği gibi bağlanır ve kimlik doğrulaması yaparsınız. Değerler farklıysa, ilgili kullanıcıyı oluşturmanız gerekebilir root@127.0.0.1.



3

aşağıdaki gibi bir hata alırsanız:

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

Ardından mysqld.sock dosya konumunuzu bulun ve "HOST" a ekleyin.

Linux üzerinde xampp kullanıyorum, bu yüzden dosyam mysqld.sockbaşka bir konumda. bu yüzden çalışmıyor ' /var/run/mysqld/mysqld.sock'

DATABASES = {

    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'asd',
        'USER' : 'root',
        'PASSWORD' : '',
        'HOST' : '/opt/lampp/var/mysql/mysql.sock',
        'PORT' : ''
    }
}

2

My.cnf dosyasındaki ayarlar yanlışsa, mysql'inizin maksimum bağlantılara ulaşıp ulaşmadığını veya oldukça sık olduğu gibi bir tür önyükleme döngüsünde olmadığını kontrol edin.

Ps aux kullanın | grep mysql ile PID'nin değişip değişmediğini kontrol edin.


2

Katkıda bulunmak için internette çok uzun süre etrafa baktım. Komut satırından mysql istemini yazmaya çalıştıktan sonra şu mesajı almaya devam ediyordum:

HATA 2002 (HY000): '/tmp/mysql.sock' soketi üzerinden yerel MySQL sunucusuna bağlanılamıyor (2)

Bunun nedeni yerel mysql sunucumun artık çalışmıyor olmasıydı. Sunucuyu yeniden başlatmak için şuraya gittim

shell> cd /user/local/bin

mysql.server'ımın bulunduğu yer. Buradan şunu yazın:

shell> mysql.server start

Bu, yerel mysql sunucusunu yeniden başlatacaktır.

Oradan gerekirse root şifresini sıfırlayabilirsiniz ..

mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass')
->                   WHERE User='root';
mysql> FLUSH PRIVILEGES;

2

Önce tüm işlem kimliklerini bularak tüm mysql örneklerini öldürmek zorunda kaldım:

ps aux | grep mysql

Ve sonra onları öldürmek:

öldür -9 {pid}

Sonra:

mysql.server başlangıcı

Benim için çalıştı.


1

Soket / tmp içinde bulunur. Unix sisteminde, / tmp üzerindeki modlar ve sahiplikler nedeniyle, bu bazı sorunlara neden olabilir. Ancak mysql bağlantınızı normal olarak kullanabileceğinizi söylediğiniz sürece, sanırım bu sizin sisteminizde bir problem değil. Mysql.sock'u daha nötr bir dizine yeniden yerleştirmek için birincil bir kontrol olmalıdır.

Sorunun "rastgele" (veya her seferinde değil) meydana gelmesi, bunun bir sunucu sorunu olabileceğini düşünmeme izin verdi.

  • / Tmp dosyanız standart bir diskte mi yoksa egzotik bir bağlantıda mı (RAM'deki gibi) bulunuyor?

  • / Tmp dosyanız boş mu?

  • Sorunla iotopkarşılaştığınızda size yanlış bir şey mi gösteriyor?


0

DB bağlantınızı 'DB Bağlantılarını Yönet iletişim kutusunda yapılandırın. Bağlantı yöntemi olarak 'Standart (TCP / IP)' seçin.

Daha fazla ayrıntı için bu sayfaya bakın http://dev.mysql.com/doc/workbench/en/wb-manage-db-connections.html

Bu diğer sayfaya göre, localhost belirtseniz bile bir soket dosyası kullanılır.

Bir ana bilgisayar adı belirtmezseniz veya özel ana bilgisayar adı localhost belirtirseniz, bir Unix soket dosyası kullanılır.

Ayrıca, şu komutları çalıştırarak sunucunuzu nasıl kontrol edeceğinizi de gösterir:

Bir mysqld işlemi çalışıyorsa, aşağıdaki komutları deneyerek bunu kontrol edebilirsiniz. Bağlantı noktası numarası veya Unix soket dosya adı, kurulumunuzda farklı olabilir. host_ip, sunucunun çalıştığı makinenin IP adresini temsil eder.

shell> mysqladmin version 
shell> mysqladmin variables 
shell> mysqladmin -h `hostname` version variables 
shell> mysqladmin -h `hostname` --port=3306 version 
shell> mysqladmin -h host_ip version 
shell> mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version

0

ubuntu14.04'te bu sorunu çözmek için bunu yapabilirsiniz.

zack@zack:~/pycodes/python-scraping/chapter5$ **mysqladmin -p variables|grep socket**
Enter password: 
| socket                                            | ***/var/run/mysqld/mysqld.sock***                                                                                            |
zack@zack:~/pycodes/python-scraping/chapter5$***ln -s  /var/run/mysqld/mysqld.sock /tmp/mysql.sock***
zack@zack:~/pycodes/python-scraping/chapter5$ ll /tmp/mysql.sock 
lrwxrwxrwx 1 zack zack 27 11 29 13:08 /tmp/mysql.sock -> /var/run/mysqld/mysqld.sock=

0

Benim için mysqld'nin başlatıldığından ve komut satırı mysql'in düzgün çalışabileceğinden eminim. Ancak httpd sunucusu sorunu gösteriyor (soket aracılığıyla mysql'e bağlanılamıyor).

Hizmeti mysqld_safe & ile başlattım.

son olarak, mysqld hizmetini hizmet mysqld start ile başlattığımda, sorunlar olduğunu (selinux izin sorunu) ve selinux sorununu düzelttiğimde ve mysqld'yi "service mysqld start" ile başlattığımda httpd bağlantı sorununun ortadan kalktığını gördüm. Ancak mysqld'yi mysqld_safe & ile başlattığımda, mysqld çalıştırılabilir. (mysql istemcisi düzgün çalışabilir). Ancak httpd ile bağlantı kurulduğunda hala sorun var.


0

Soketle ilgiliyse bu dosyayı okuyun

/etc/mysql/my.cnf

ve standart soket konumunun ne olduğunu görün. Şöyle bir satır:

socket = /var/run/mysqld/mysqld.sock

şimdi kabuğunuz için aşağıdaki gibi bir takma ad oluşturun:

alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock"

Bu şekilde root ayrıcalıklarına ihtiyacınız olmaz.


0

Sadece koşmayı dene mysqld .

Mac'te benim için çalışmayan şey buydu. Çalışmazsa, /usr/local/var/mysql/<your_name>.errayrıntılı hata günlüklerini görmeyi deneyin .


0
# shell script ,ignore the first 
$ $(dirname `which mysql`)\/mysql.server start

Yardımcı olabilir.


En yıldız yanıtı olan 'sudo /usr/local/mysql/support-files/mysql.server start' ile aynı, ancak farklı işletim sistemleri 'mysql.server'ın farklı yoluna sahip olabilir. birçok işletim sisteminde yararlı olabilir.
陈 也在 哦

0

Homebrew aracılığıyla yüklenen MySQL 8.0.19 için MacOS Mojave 10.14.6'yı kullanma

  • Koştu sudo find / -name my.cnf
  • Dosya bulundu /usr/local/etc/my.cnf

Bir süre çalıştı ve sonunda hata geri döndü. MySQL'in Homebrew sürümünü kaldırdı ve .dmg dosyasını doğrudan buradan

O zamandan beri mutlu bir şekilde bağlanıyorum.


0

Benim durumumda yardımcı olan şey dosyayı düzenlemek /etc/mysql/mysql.conf.d/mysqld.cnfve satırı değiştirmek oldu:

socket      = /var/run/mysqld/mysqld.sock

ile

socket      = /tmp/mysql.sock

Sonra sunucuyu yeniden başlattım ve iyi çalıştı. İşin garibi, satırı daha önce olduğu gibi geri koyup yeniden başlatırsam, yine de çalıştı ..


0

Son zamanlarda benzer bir sorunla karşılaşmıştım. Birçok cevaba baktım. Adımları takip ederek çalıştırdım.

  1. /etc/my.cnf'deki soket yolunu değiştirin (/tmp/mysql.sock ile sürekli olarak hata aldığım için) başvurusu
  2. Hata olması durumunda yeniden başlatmanın önerilen yolu olduğundan sunucuyu yeniden başlatmak için mysqld_safe çalıştırın. mysqld_safe referansı

0

Benim için mysql sunucusu çalışmıyordu. Ben de mysql sunucusunu

mysql.server start

sonra

mysql_secure_installation

sunucuyu güvenli hale getirmek için ve şimdi MySQL sunucusunu şu yolla ziyaret edebilirim:

sudo mysql -uroot -p

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.