Tidak dapat terhubung ke server MySQL lokal melalui socket '/tmp/mysql.sock


126

Ketika saya mencoba untuk terhubung ke server MySQL lokal selama rangkaian pengujian saya, itu gagal dengan kesalahan:

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

Namun, saya dapat setiap saat, terhubung ke MySQL dengan menjalankan mysqlprogram baris perintah . A ps aux | grep mysqlmenunjukkan server sedang berjalan, dan stat /tmp/mysql.sockmengkonfirmasi bahwa soket ada. Selanjutnya, jika saya membuka debugger di exceptklausul pengecualian itu, saya dapat terhubung dengan andal dengan parameter yang sama persis.

Masalah ini mereproduksi cukup andal, namun tampaknya tidak 100%, karena setiap kali di bulan biru, rangkaian pengujian saya sebenarnya berjalan tanpa mengenai kesalahan ini. Ketika saya mencoba untuk menjalankan dengan sudo dtrussitu tidak mereproduksi.

Semua kode klien ada di Python, meskipun saya tidak tahu bagaimana itu bisa relevan.

Beralih untuk menggunakan host 127.0.0.1menghasilkan kesalahan:

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

1
Apakah mungkin bahwa Anda entah bagaimana mencapai database dengan banyak koneksi bersamaan? Mungkin coba tingkatkan max_connectionsdi file conf MySQL Anda?
dgel

2
tidak mysql -h 127.0.0.1bekerja dari commandline? Saya tidak begitu yakin server mysql Anda benar-benar mendengarkan pada port TCP.
Eli

1
Apakah Anda yakin memiliki versi pustaka klien Python MySQL yang benar untuk versi MySQL Anda? Juga, apakah mysql -h localhostbekerja dengan andal?
Old Pro

2
Apakah MySQL mencatat sesuatu ke log kesalahan? Juga, periksa izin file di /tmp/mysql.sock dan direktori data mysql Anda. Apakah kesalahan juga terjadi jika Anda menjalankan rangkaian pengujian sebagai root (sudo)?
Erik Cederstrand

2
Banyak dari saran ini tercakup dalam manual referensi resmi MySQL yang saya rujuk dalam tanggapan saya di bawah ini. Ini adalah penggunaan waktu yang lebih baik untuk membaca saran manual referensi MySQL secara sistematis, daripada mencoba hanya satu atau dua dari saran itu.
jtoberon

Jawaban:


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

Ini berhasil untuk saya. Namun, jika ini tidak berhasil, pastikan bahwa mysqld sedang berjalan dan coba sambungkan.


1
Saya telah menghabiskan lebih dari 2 minggu (bahkan tidak bercanda) dan ini adalah waktu terdekat saya untuk akhirnya dapat terhubung. Namun itu macet di 'memulai mysql' ..... Tapi terima kasih, posting bagus!
L. Klotz

2
sudo: /usr/local/mysql/support-files/mysql.server: perintah tidak ditemukan. Mengapa?
Syam Pillai

1
Mengapa titik dua setelah sudo? Periksa apakah jalurnya ada
Pratyay

Atau, jika mysql diinstal dengan homebrew: sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start
Majoren

1
Server berhenti tanpa memperbarui file PID (/var/lib/mysql/Saranshs-MacBook-Pro.local.pid).
saran3h

90

Bagian yang relevan dari manual MySQL ada di sini . Saya akan mulai dengan melalui langkah-langkah debugging yang tercantum di sana.

Juga, ingat bahwa localhost dan 127.0.0.1 bukanlah hal yang sama dalam konteks ini:

  • Jika host diatur ke localhost, maka soket atau pipa digunakan.
  • Jika host disetel ke 127.0.0.1, maka klien dipaksa untuk menggunakan TCP / IP.

Jadi, misalnya, Anda dapat memeriksa apakah database Anda mendengarkan koneksi TCP netstat -nlp. Vi . Tampaknya IS mendengarkan koneksi TCP karena Anda mengatakan itu mysql -h 127.0.0.1berfungsi dengan baik. Untuk memeriksa apakah Anda dapat terhubung ke database Anda melalui soket, gunakan mysql -h localhost.

Jika tidak ada yang membantu, Anda mungkin perlu memposting lebih banyak detail tentang konfigurasi MySQL Anda, persis bagaimana Anda membuat contoh koneksi, dll.


Meskipun secara umum mengikuti prosedur diagnostik yang ditetapkan adalah ide yang baik, jika Anda membaca pertanyaan (dan prosedurnya), Anda akan melihat bahwa prosedur telah diikuti dan telah ditentukan bahwa ini bukan masalah dengan server MySQL. Ini adalah sesuatu yang secara khusus harus dilakukan dengan klien Python karena semua akses lain melalui soket berfungsi dengan baik, termasuk akses lain dari Python.
Old Pro

1
Aneh sekali. Saya memposting prosedur yang ditetapkan karena beberapa alasan: (1) orang lain memposting hanya sebagian dari prosedur yang ditetapkan dan lebih baik sistematis tentang debugging, (2) tampaknya ada beberapa kebingungan tentang localhost vs 127.0.0.1, dan (3 ) orang lain dengan gejala "Tidak dapat terhubung ke server mysql lokal" yang sama kemungkinan besar akan tersandung pada pertanyaan ini. Saya sadar bahwa kemungkinan besar klien Python, itulah sebabnya saya meminta informasi lebih lanjut, misalnya tentang bagaimana koneksi dibuat.
jtoberpada

4
+1 Saya mendapatkan kesalahan ini saat mencoba menyambung ke mysql melalui terowongan ssh (menggunakan localhostsebagai host). Mengubah untuk 127.0.0.1memperbaikinya.
krock

Sebagai catatan, ini memperbaiki masalah saya: "Tidak dapat terhubung ke server MySQL lokal melalui soket '/tmp/mysql.sock'".
proinsias

Terima kasih! itu berhasil untuk saya perbaikan ini ketika mencoba untuk terhubung ke kontainer maridb buruh pelabuhan.
Lucian Oprea

86

Bagi saya masalahnya adalah saya tidak menjalankan server mysql. Jalankan server terlebih dahulu lalu jalankan mysql.

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

28

Saya telah melihat ini terjadi di toko saya ketika devs saya memiliki manajer tumpukan seperti MAMP yang diinstal yang sudah dikonfigurasi dengan MySQL yang diinstal di tempat yang tidak standar.

di terminal Anda

mysql_config --socket

yang akan memberi Anda jalur ke file kaus kaki. ambil jalur itu dan gunakan di parameter DATABASES HOST Anda.

Yang perlu Anda lakukan adalah mengarahkan

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

CATATAN

juga berjalan which mysql_configjika Anda entah bagaimana memiliki beberapa contoh server mysql yang diinstal pada mesin Anda mungkin terhubung ke yang salah.


Bagaimana jika file kaus kaki Anda hilang?
AlxVallejo

beli sepasang lagi? j / k itu berarti layanan mysql tidak berjalan. mulai / restart mysql Anda
Francis Yaconiello

6
Dalam kasus saya, mengubah HOST dari "localhost" menjadi "127.0.0.1" memecahkan masalah.
lucaswxp

@lucaswxp: Dalam kasus saya, saya harus mengubah localhost dengan nama domain
Anshul Mishra

19

Saya baru saja mengubah HOSTdari localhostmenjadi 127.0.0.1dan berfungsi dengan baik:

# 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
Alangkah baiknya mengetahui file apa yang Anda ubah dan di mana lokasinya
Empi

1
Dalam settings.pyproyek tersebut.
Sirbito X

11

Kapan, jika Anda kehilangan daemon mysql di mac OSx tetapi ada di jalur lain misalnya di private / var lakukan perintah berikut

1)

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

2) restart koneksi Anda ke mysql dengan:

mysql -u username -p -h host databasename

bekerja juga untuk mariadb


9

Jalankan cmd di bawah ini di terminal

/ usr / local / mysql / bin / mysqld_safe

masukkan deskripsi gambar di sini

Kemudian restart mesin untuk diterapkan. Berhasil!!


1
Ini berfungsi untuk saya di iMac yang menjalankan High Sierra yang telah ditingkatkan ke Mojave. Yang pasti terjadi adalah file mysql.sock telah di tmp dan dihapus saat upgrade. Karena soket dibuat secara otomatis saat memulai MySQL, Anda hanya perlu memastikan MySQL dimatikan dan kemudian memulainya dalam mode aman, seperti di atas. File mysql.sock muncul secara ajaib.
David

8

Periksa jumlah file yang terbuka untuk proses mysql menggunakan perintah lsof.

Tingkatkan batas file yang terbuka dan jalankan kembali.


Saya pernah mengalami ini sebelumnya juga, dan Anda tidak dapat hanya melakukan ini melalui file .cnf Anda. Anda mungkin benar-benar perlu ulimitmenambah jumlah file terbuka yang boleh dibuka oleh klien dan server Anda. jika Anda menggunakan ubuntu versi terbaru, ini mungkin memerlukan pengeditan skrip mysql upstart di / etc / init tetapi mudah-mudahan Anda bisa melakukannya di file .cnf.
underrun

8

Setelah mencoba beberapa solusi ini dan tidak berhasil, inilah yang berhasil untuk saya:

  1. Mulai ulang sistem
  2. mysql.server mulai
  3. Keberhasilan!

7

Ini mungkin salah satu masalah berikut.

  1. Kunci mysql salah. solusi: Anda harus menemukan soket mysql yang benar dengan,

variabel mysqladmin -p | grep socket

dan kemudian masukkan ke dalam kode koneksi db Anda:

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

/tmp/mysql.sock adalah hasil dari grep

2. Solusi port mysql salah: Anda harus mencari tahu port mysql yang benar:

mysqladmin -p variables | grep port

lalu di kode Anda:

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

3306 adalah port yang dikembalikan dari grep

Saya pikir opsi pertama akan menyelesaikan masalah Anda.


6

Bagi mereka yang mengupgrade dari 5.7 ke 8.0 melalui homebrew, kesalahan ini kemungkinan besar disebabkan oleh peningkatan yang tidak selesai. Dalam kasus saya, mysql.server startbuat saya kesalahan berikut:

KESALAHAN! Server berhenti tanpa memperbarui file PID

Saya kemudian memeriksa file log melalui cat /usr/local/var/mysql/YOURS.err | tail -n 50, dan menemukan yang berikut:

InnoDB: Upgrade setelah crash tidak didukung.

Jika Anda berada di perahu yang sama, pertama instal mysql@5.7melalui homebrew, hentikan server, lalu mulai sistem 8.0 lagi.

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

Kemudian,

mysql.server start

Ini akan membuat MySQL (8.0) Anda berfungsi kembali.


Saya mendapatkan hal yang sama ERROR! The server quit without updating PID filelagi.
awebartisan

Dalam kasus saya, saya baru saja menginstal mysql@5.7 dan menghapus terbaru. Semuanya dimulai. Tidak ada database yang dihapus.
Andrew Luca

4

Saya rasa saya melihat perilaku yang sama beberapa waktu lalu, tetapi tidak dapat mengingat detailnya.
Dalam kasus kami, masalahnya adalah saat testrunner menginisialisasi koneksi database relatif terhadap interaksi database pertama yang diperlukan, misalnya, dengan mengimpor modul di settings.py atau beberapa __init__.py. Saya akan mencoba menggali lebih banyak info lagi, tetapi ini mungkin sudah membunyikan bel untuk kasus Anda.


4

Pastikan / etc / hosts Anda ada 127.0.0.1 localhostdi dalamnya dan itu akan berfungsi dengan baik


Hebatnya (dengan hormat) ini menyortirnya untuk saya - saat memeriksa ini saya menemukan bahwa ketika mencoba mengatur webdav Mavericks telah menambahkan beberapa baris tambahan (benar-benar kacau) ke file host saya - termasuk yang menetapkan kembali localhost.
rob_was_taken pada

4

Saya punya dua dugaan licik yang satu ini

KONJEKTUR # 1

Perhatikan kemungkinan tidak dapat mengakses /tmp/mysql.sockfile tersebut. Ketika saya mengatur database MySQL, saya biasanya membiarkan situs file socket masuk /var/lib/mysql. Jika Anda login ke mysql as root@localhost, sesi OS Anda memerlukan akses ke /tmpfolder tersebut. Pastikan /tmpmemiliki hak akses yang benar di OS. Selain itu, pastikan pengguna sudo selalu dapat membaca file dalam format/tmp .

KONJEKTUR # 2

Mengakses mysql melalui 127.0.0.1 dapat menyebabkan kebingungan jika Anda tidak memperhatikan. Bagaimana?

Dari baris perintah, jika Anda terhubung ke MySQL dengan 127.0.0.1, Anda mungkin perlu menentukan protokol TCP / IP.

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

atau coba nama DNS

mysql -uroot -p -hDNSNAME

Ini akan melewati proses masuk sebagai root@localhost, tapi pastikan Anda punyaroot@'127.0.0.1' menentukan.

Lain kali Anda terhubung ke MySQL, jalankan ini:

SELECT USER(),CURRENT_USER();

Ini memberi Anda apa?

  • PENGGUNA () melaporkan cara Anda mencoba mengautentikasi di MySQL
  • CURRENT_USER () melaporkan bagaimana Anda diizinkan untuk mengotentikasi di MySQL

Jika fungsi-fungsi ini kembali dengan nilai yang sama, maka Anda menghubungkan dan mengautentikasi seperti yang diharapkan. Jika nilainya berbeda, Anda mungkin perlu membuat pengguna yang sesuai root@127.0.0.1.



3

jika Anda mendapatkan error seperti di bawah ini:

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

Kemudian cari saja lokasi file mysqld.sock Anda dan tambahkan ke "HOST".

Seperti saya menggunakan xampp di linux jadi mysqld.sockfile saya ada di lokasi lain. jadi tidak bekerja untuk ' /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

Periksa apakah mysql Anda belum mencapai koneksi maksimum, atau tidak berada dalam loop boot seperti yang sering terjadi jika pengaturan di my.cnf salah.

Gunakan ps aux | grep mysql untuk memeriksa apakah PID berubah.


2

Terlalu lama melihat-lihat online untuk tidak berkontribusi. Setelah mencoba mengetikkan prompt mysql dari baris perintah, saya terus menerima pesan ini:

ERROR 2002 (HY000): Tidak dapat terhubung ke server MySQL lokal melalui soket '/tmp/mysql.sock' (2)

Ini karena server mysql lokal saya tidak lagi berjalan. Untuk memulai ulang server, saya menavigasi ke

shell> cd /user/local/bin

di mana mysql.server saya berada. Dari sini, cukup ketik:

shell> mysql.server start

Ini akan meluncurkan kembali server mysql lokal.

Dari sana Anda dapat mengatur ulang kata sandi root jika perlu ..

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

2

Saya harus mematikan semua contoh mysql dengan terlebih dahulu menemukan semua ID proses:

ps aux | grep mysql

Dan kemudian membunuh mereka:

bunuh -9 {pid}

Kemudian:

mysql.server mulai

Bekerja untuk saya.


1

Soket terletak di / tmp. Pada sistem Unix, karena mode & kepemilikan di / tmp, ini dapat menyebabkan beberapa masalah. Tapi, selama Anda memberi tahu kami bahwa Anda BISA menggunakan koneksi mysql Anda secara normal, saya kira itu bukan masalah pada sistem Anda. Pemeriksaan utama harus untuk merelokasi mysql.sock di direktori yang lebih netral.

Fakta bahwa masalah terjadi "secara acak" (atau tidak setiap saat) membuat saya berpikir bahwa ini bisa menjadi masalah server.

  • Apakah / tmp Anda terletak pada disk standar, atau pada dudukan eksotis (seperti pada RAM)?

  • Apakah / tmp Anda kosong?

  • Apakah iotopmenunjukkan sesuatu yang salah saat Anda menghadapi masalah?


0

Konfigurasikan koneksi DB Anda dalam dialog 'Kelola Koneksi DB. Pilih 'Standar (TCP / IP)' sebagai metode koneksi.

Lihat halaman ini untuk detail lebih lanjut http://dev.mysql.com/doc/workbench/en/wb-manage-db-connections.html

Menurut halaman lain ini, file soket digunakan bahkan jika Anda menentukan localhost.

File socket Unix digunakan jika Anda tidak menentukan nama host atau jika Anda menentukan nama host khusus localhost.

Ini juga menunjukkan cara memeriksa server Anda dengan menjalankan perintah berikut:

Jika proses mysqld sedang berjalan, Anda dapat memeriksanya dengan mencoba perintah berikut. Nomor port atau nama file soket Unix mungkin berbeda dalam pengaturan Anda. host_ip mewakili alamat IP mesin tempat server berjalan.

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

di ubuntu14.04 Anda dapat melakukan ini untuk mengatasi masalah ini.

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

Bagi saya, saya yakin mysqld sudah dimulai, dan baris perintah mysql dapat bekerja dengan baik. Tetapi server httpd menunjukkan masalah (tidak dapat terhubung ke mysql melalui soket).

Saya memulai layanan dengan mysqld_safe &.

akhirnya, saya menemukan ketika saya memulai layanan mysqld dengan layanan mysqld start, ada masalah (masalah izin selinux), dan ketika saya memperbaiki masalah selinux, dan memulai mysqld dengan "layanan mysqld start", masalah koneksi httpd hilang. Tetapi ketika saya memulai mysqld dengan mysqld_safe &, mysqld dapat bekerja. (klien mysql dapat bekerja dengan baik). Tapi masih ada masalah saat terhubung dengan httpd.


0

Jika terkait soket, baca file ini

/etc/mysql/my.cnf

dan lihat apa lokasi soket standar. Ini garis seperti:

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

sekarang buat alias untuk shell Anda seperti:

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

Dengan cara ini Anda tidak memerlukan hak akses root.


0

Coba saja lari mysqld .

Inilah yang tidak berhasil untuk saya di mac. Jika tidak berhasil, coba buka /usr/local/var/mysql/<your_name>.erruntuk melihat log kesalahan mendetail.


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

Semoga bermanfaat.


Sama seperti jawaban paling bintang 'sudo /usr/local/mysql/support-files/mysql.server start', tetapi OS yang berbeda mungkin memiliki jalur berbeda dari 'mysql.server'. Jadi saya mencoba menulis satu baris perintah yang mungkin berguna di banyak OS.
陈 也在 哦

0

Menggunakan MacOS Mojave 10.14.6 untuk MySQL 8.0.19 yang diinstal melalui Homebrew

  • Ran sudo find / -name my.cnf
  • File ditemukan di /usr/local/etc/my.cnf

Bekerja untuk beberapa saat kemudian akhirnya kesalahan kembali. Menghapus versi Homebrew MySQL dan menginstal file .dmg langsung dari sini

Terhubung dengan senang hati sejak itu.


0

Dalam kasus saya, yang membantu adalah mengedit file /etc/mysql/mysql.conf.d/mysqld.cnfdan mengganti baris:

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

dengan

socket      = /tmp/mysql.sock

Kemudian saya me-restart server dan berfungsi dengan baik. Lucunya, jika saya mengembalikan saluran seperti sebelumnya dan memulai ulang, itu masih berfungsi ..


0

Saya menghadapi masalah serupa baru-baru ini. Pergi melalui banyak jawaban. Saya membuatnya berfungsi dengan mengikuti langkah-langkah.

  1. ubah jalur soket di /etc/my.cnf (karena saya berulang kali mendapatkan kesalahan dengan /tmp/mysql.sock) referensi untuk mengubah jalur soket
  2. jalankan mysqld_safe untuk memulai ulang server karena ini adalah cara yang disarankan untuk memulai ulang jika terjadi kesalahan. referensi ke mysqld_safe

0

Bagi saya, server mysql tidak berjalan. Jadi, saya memulai server mysql melalui

mysql.server start

kemudian

mysql_secure_installation

untuk mengamankan server dan sekarang saya dapat mengunjungi server MySQL melalui

sudo mysql -uroot -p

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.