Що має містити mysqld.sock, чому я не маю його?


22

Хтось знає, чому мій /var/run/mysqld/mysqld.sockфайл сокета не буде на моєму комп’ютері під час встановлення (або перевстановлення) MySQL 5.1?

Прямо зараз, коли я намагаюся запустити сервер з mysqld, у мене виникають помилки Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect, але створення порожнього файлу з таким ім'ям (як це пропонується на форумах ubuntu) виявилося невдалим.

У мене були і mysql, і postgres, які служили прекрасно, поки я не перейшов на natty трохи часу тому; Я провів години, гуляючи по обох базах даних, намагаючись зрозуміти, що відбувається. Я можу відмовитись від postgres, але я не можу працювати без робочої копії mysql.

Найцікавіша частина: я використовую Kubuntu, і я розумію, що KDE використовує mysql для зберігання дозволів користувачів тощо. У мене немає жодних дивних проблем з дозволами; чи можу я вважати це тим, що (якось?) MySQL насправді працює?

Можливо, ці файли сокетів живуть в іншому місці в natty? Було б простіше просто встановити ОС свіжий? На даний момент я відкритий до будь-яких пропозицій, які перестануть витрачати час на мене.


Спочатку потрібно запустити сервер mysql, а потім цей файл /var/run/mysqld/mysqld.sockбуде створений. Як сказав @Paul, ви повинні видалити будь-який файл, який ви розмістили в цьому місці.
Еван Ху

Відповіді:


18

Файл сокета насправді не містить даних, він передає їх. Це особливий, незвичайний тип файлів, створений за допомогою спеціальних системних викликів / команд. Це не звичайний файл.

Це як труба, яку сервер може використовувати клієнти для підключення та обміну запитами та даними. Також використовується лише місцево. Його значення є лише узгодженим місцем зустрічі у файловій системі.

Створення простого старого файлу та розміщення його в тому місці може фактично заважати створенню його сервера ... і тим самим заважати локальним клієнтам підключатися до сервера.

Моя рекомендація - видалити будь-який файл, розміщений у вашому місці. Сервер створює спеціальний файл сокета.


1
Дякую за пояснення файлів сокетів, і вибачте за Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect
непросте слово

але як він створений? тому що я досі цього не маю ..: -яка ідея?
jpganz18

Напевно у вас є клієнт mysql, який очікує, що сокет буде в цьому місці, але сервер не створює його там (або сервер не працює) Якщо сервер працює, загляньте в / tmp або використовуйте find or locate для знайдіть файл сокета, а потім запустіть клієнт mysql з -S <шлях до файлу сокета>
sed_and_done

20

Коли Ви вкажете host=localhost, клієнт mysql спробує увійти на сервер mysql, використовуючи unix з ім'ям pipe, для якого потрібен .sockфайл.

Це можна обійти, вказавши хост = 127.0.0.1. Це змусить клієнта mysql використовувати TCP для підключення до сервера.

Взяте з документації MySQL :

mysql --host=127.0.0.1 --port=3306 --user=your_uname --password=your_pass

Це насправді геніальна (і дуже потрібна) відповідь, оскільки, історично кажучи, я бачив mysql.sockзникнення без жодної уваги в кожній версії MySQL, з якою я працював (назад до 4.0). Коли це відбувається, я входжу так само, але використовую --protocol=tcpзамість цього --port. Коли ви вимикаєте mysql, сервіс шукає файл сокета. Таким чином, біг service mysql stopбув би невдалим. Щоб обійти відсутній файл сокетного болю, я бігаю mysqladmin -h127.0.0.1 --protocol=tcp -uroot -p shutdown. Ой, BTW, +1 !!!
RolandoMySQLDBA

Дякую. Це була моя перша відповідь в Інтернеті :) І так. Альтернативний метод використання TCP полягає у введенні --protocol = tcp.
sccott

14

Сокет - це спеціальний псевдофайл, який використовується для передачі даних за допомогою читання та запису, а не для зберігання даних.

Файл сокета створюється при запуску послуги та видаляється після припинення послуги. Розташування файлу визначається /etc/my.cnfтак:

[mysqld]
socket=/var/run/mysql/mysql.sock

8

У моєму випадку запущений файл mysqld_safeстворив новий mysqld.sockфайл.

$ cd /etc/init.d/
$ mysqld_safe

Ви, ймовірно, не отримаєте швидкого повернення, але якщо ви перезапустите сеанс, файл mysqld.sock буде десь. Знайдіть його за допомогою

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

2

У мене була така ж проблема з відсутнім mysqld.sock. Я зайшов до каталогу, який містив mysql, а саме /usr/binв моєму випадку. Тоді я видав команду

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

Подвійний mysql - це не помилка друку, але, швидше, mysql - це база даних, яка завжди буде там у новій установці MySQL. Я не знаю --host, --passwordчи --portпотрібні вони, але оскільки я працював на мене за допомогою цих параметрів, я включаю їх. Як тільки з'явився MySQL, я зайшов до таблиці користувачів, як встановити пароль для root. Як тільки MySQL з'явився, був створений файл без сокета. Я сподіваюся, що це комусь допомагає, бо я боровся цілими днями.


1

Якщо ви використовуєте nginx php-fastcgi і у вас виникла помилка 502 Bad Gateway, ніж вам потрібно подивитися на вашу конфігурацію віртуального хоста у файлі конфігурації nginx. Ви повинні встановити або виправити fastcgi_passпараметр fastcgi_pass. Змінна для встановлення з'єднання сокета між nginx і php CGI.

Іншим питанням є те, що бінарний початковий сценарій може пропустити наступні записи (важливі), відкриті разом із: nano /usr/bin/php-fastcgi

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

Повний вміст мого початкового сценарію / 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.