Apa yang harus mengandung mysqld.sock, mengapa saya tidak memilikinya?

22

Adakah yang tahu mengapa /var/run/mysqld/mysqld.sockfile socket saya tidak ada di komputer saya ketika saya menginstal (atau menginstal ulang) MySQL 5.1?

Saat ini, ketika saya mencoba untuk memulai server dengan mysqld, saya mendapatkan kesalahan seperti Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect, tetapi membuat file kosong dengan nama itu (seperti yang disarankan di forum ubuntu) tidak berhasil.

Saya memiliki mysql dan postgres yang berfungsi dengan baik sampai saya upgrade ke natty beberapa waktu yang lalu; Saya telah menghabiskan waktu berjam-jam berjalan melalui kedua database mencoba untuk mencari tahu apa yang sedang terjadi. Saya bisa menyerah pada postgres, tetapi saya tidak bisa bekerja tanpa copy mysql yang berfungsi.

Bagian yang paling aneh: Saya menggunakan Kubuntu, dan pemahaman saya adalah bahwa KDE menggunakan mysql untuk menyimpan izin pengguna, dll. Saya tidak mengalami masalah izin aneh; dapatkah saya menganggap ini berarti (entah bagaimana?) MySQL sebenarnya berfungsi?

Mungkin file socket ini hidup di tempat yang berbeda di natty? Apakah lebih mudah menginstal ulang os fresh? Pada titik ini, saya terbuka untuk semua saran yang akan berhenti membuang waktu saya.

egbutter
sumber
Anda harus memulai server mysql terlebih dahulu dan kemudian file itu /var/run/mysqld/mysqld.sockakan dibuat. Seperti yang dikatakan @Paul, Anda harus menghapus file apa pun yang Anda masukkan ke lokasi itu.
Evan Hu

Jawaban:

18

File socket tidak benar-benar berisi data, ini mengangkutnya .. Ini adalah tipe file khusus yang tidak biasa yang dibuat dengan panggilan / perintah sistem khusus. Ini bukan file biasa.

Ini seperti pipa yang dapat digunakan oleh server dan klien untuk menghubungkan dan bertukar permintaan dan data. Juga, ini hanya digunakan secara lokal. Signifikansi hanyalah sebagai lokasi pertemuan yang disepakati dalam sistem file.

Membuat file lama biasa dan meletakkannya di lokasi itu dapat benar-benar mengganggu server membuatnya ... dan dengan demikian mencegah klien lokal dari terhubung ke server.

Rekomendasi saya adalah menghapus semua file yang Anda letakkan di lokasi. File soket khusus dibuat oleh server.

Paul
sumber
1
Terima kasih atas penjelasan tentang file socket, dan maaf tentang pertanyaan yang tidak diucapkan dengan kata-kata: masalah asli saya adalah bahwa file socket tidak ada - kesalahan yang terus dilemparkan oleh mysql adalahCan't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect
egbutter
tetapi bagaimana ini dibuat? karena saya masih belum memilikinya ..: -Apakah ada ide?
jpganz18
Anda mungkin memiliki klien mysql yang mengharapkan soket berada di lokasi itu, tetapi server tidak membuatnya di sana (atau server tidak berjalan) Jika server sedang berjalan, lihat / tmp atau gunakan cari atau temukan ke cari file socket, lalu mulai klien mysql dengan -S <path to socket file>
sed_and_done
20

Ketika Anda menentukan host=localhost, klien mysql akan mencoba masuk ke server mysql menggunakan pipa bernama unix yang membutuhkan .sockfile.

Ini dapat dilewati dengan menentukan host = 127.0.0.1. Ini akan membuat klien mysql menggunakan TCP untuk terhubung ke server.

Diambil dari dokumentasi MySQL :

mysql --host=127.0.0.1 --port=3306 --user=your_uname --password=your_pass
sccott
sumber
Ini sebenarnya jawaban yang brilian (dan sangat dibutuhkan) karena, secara historis, saya telah melihat mysql.sockmenghilang tanpa alasan yang baik di setiap versi MySQL yang saya gunakan (kembali ke 4.0). Ketika ini terjadi, saya masuk hanya seperti ini tetapi saya gunakan --protocol=tcpsebagai gantinya --port. Ketika Anda mematikan mysql, layanan mencari file socket. Dengan demikian, berlari service mysql stopakan gagal. Untuk mengatasi sakit kepala file socket yang hilang, saya menjalankan mysqladmin -h127.0.0.1 --protocol=tcp -uroot -p shutdown. Oh, BTW, +1 !!!
RolandoMySQLDBA
Terima kasih. Ini adalah jawaban pertama saya di mana saja online :) Dan ya. Metode alternatif untuk menggunakan TCP adalah dengan menetapkan --protocol = tcp.
sccott
14

Socket adalah file pseudo khusus yang digunakan untuk transmisi data dengan membaca dan menulis, bukan penyimpanan data.

File soket dibuat ketika layanan dimulai dan dihapus ketika layanan dihentikan. Lokasi file didefinisikan /etc/my.cnfseperti ini:

[mysqld]
socket=/var/run/mysql/mysql.sock
Michael
sumber
8

Dalam kasus saya, menjalankan mysqld_safemembuat mysqld.sockfile baru .

$ cd /etc/init.d/
$ mysqld_safe

Anda mungkin tidak akan mendapatkan prompt kembali, tetapi jika Anda memulai kembali sesi Anda, file mysqld.sock akan ada di suatu tempat. Temukan dengan

$ sudo find / -type s | grep mysqld.sock
aviggiano
sumber
2

Saya memiliki masalah yang sama dengan mysqld.sock yang hilang. Saya pergi ke direktori yang berisi mysql, yaitu /usr/bindalam kasus saya. Lalu saya mengeluarkan perintah

mysql mysql --host=localhost --password=whatever --port=3306

Double mysql bukan kesalahan ketik tetapi mysql adalah database yang akan selalu ada di instalasi MySQL baru. Saya tidak tahu apakah --host, --passwordatau --portdiperlukan tetapi karena ini bekerja untuk saya menggunakan parameter ini saya termasuk mereka. Setelah MySQL muncul, saya masuk ke tabel pengguna sebagai mengatur kata sandi untuk root. Setelah MySQL muncul, file soket yang hilang telah dibuat. Saya harap ini membantu seseorang karena saya berjuang selama berhari-hari.

James
sumber
1

Jika Anda menggunakan nginx php-fastcgi dan Anda mendapat 502 Bad Gateway error daripada Anda harus melihat konfigurasi virtual host Anda pada file konfigurasi nginx. Anda harus mengatur atau memperbaiki fastcgi_passparameter. Ini fastcgi_passadalah variabel untuk mengatur koneksi soket antara nginx dan php CGI.

Masalah lain adalah skrip starter biner bisa melewatkan entri berikut (penting) terbuka dengan: nano /usr/bin/php-fastcgi

SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid

Isi lengkap skrip pemula saya / usr / bin / php-fastcgi:

#!/bin/bash

FASTCGI_USER=www-data
FASTCGI_GROUP=www-data
SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid
CHILDREN=6
PHP5=/usr/bin/php5-cgi

/usr/bin/spawn-fcgi -s $SOCKET -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5
Aysad Kozanoglu
sumber