Что должен содержать 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? Будет ли проще просто переустановить ОС fresh? На данный момент я открыт для любых предложений, которые перестанут тратить мое время.

egbutter
источник
Вам необходимо сначала запустить сервер 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 или locate для найдите файл сокета, затем запустите клиент mysql с -S <путь к файлу сокета>
sed_and_done
20

Когда вы укажете host=localhost, клиент MySQL попытается войти на сервер MySQL, используя именованный канал Unix, для которого требуется .sockфайл.

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

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

mysql --host=127.0.0.1 --port=3306 --user=your_uname --password=your_pass
sccott
источник
Это действительно блестящий (и очень необходимый) ответ, потому что, исторически говоря, я видел mysql.sockисчезновение без всякой уважительной причины в каждой версии MySQL, с которой я работал (вернуться к 4.0). Когда это происходит, я вхожу так же, но я использую --protocol=tcpвместо --port. Когда вы выключаете mysql, сервис ищет файл сокета. Таким образом, бег не service mysql stopполучится. Чтобы обойти отсутствующую головную боль файла сокета, я бегу mysqladmin -h127.0.0.1 --protocol=tcp -uroot -p shutdown. О, кстати, +1 !!!
RolandoMySQLDBA
Спасибо. Это был мой первый ответ в любом месте онлайн :) И да. Альтернативный способ использовать TCP - указать --protocol = tcp.
сккотт
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
aviggiano
источник
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
Айсад Козаноглу
источник