zaLinux.ru

Ошибка «ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/run/mysqld/mysqld.sock’ (2 «No such file or directory»)» (РЕШЕНО)


При попытке подключения к серверу MySQL может возникнуть ошибка:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2 "No such file or directory")

Вариант на другом дистрибутиве (отличается путь до файла mysqld.sock):

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Ошибка означает, что не получается подключиться к MySQL серверу через сокет /run/mysqld/mysqld.sock, поскольку данный файл просто не существует.

Эта ошибка может возникнуть при использовании примерно следующей команды:

mysql -u root

Причём она одинакова и для MySQL и для MariaDB.

Причина ошибки всегда одна — на хосте, к которому вы пытаетесь подключиться, не работает служба MySQL/MariaDB. Конкретных вариантов может быть множество: от банальных что вы забыли установить службу до более сложных, когда из-за ошибки в команде вы подключаетесь не к тому хосту.

Убедитесь, что MySQL/MariaDB сервер установлен

В первую очередь убедитесь, что СУБД MySQL или MariaDB вообще установлены.

Пакет может называться mysql-server или mysql. Если вы выбрали MariaDB вместо MySQL, то пакет называется mariadb-server или mariadb.

Пакеты mysql-client или mariadb-clients или какие-то ещё НЕ подходят! Это только клиенты для подключения, но не сам сервер.

На Ubuntu, Linux Mint и других дистрибутивах из этой семьи для установки выполните:

sudo apt install mysql-server

Убедитесь, что служба MySQL/MariaDB запущена

Файл /run/mysqld/mysqld.sock создаётся когда MySQL или MariaDB сервер установлен и запущен. Поэтому проверим статус сервера следующей командой (подходит и для MySQL, и для MariaDB):

systemctl status mysqld.service

Должен быть статус active (running).

Если служба не запущена, то запустите её командой:

sudo systemctl start mysqld.service

После этого проверьте статус службы

Добавления службы в автозагрузку (чтобы не пришлось её запускать при каждом включении компьютера, выполните следующую команду):

sudo systemctl enable mysqld.service

Убедитесь, что служба MySQL/MariaDB настроена правильно

Если причина проблемы оказалась в том, что служба не запущена и после попытки запуска служба вновь оказалась неактивной, значит проблема может быть в неправильной настройке сервера MySQL/MariaDB.

Файлы конфигурации (настроек) MySQL и MariaDB могут размещаться в разных директориях, например:

  • /etc/my.cnf
  • /etc/mysql/my.cnf
  • /var/lib/mysql/my.cnf

При этом в файлах могут быть установлены различные значения одной и той же настройки, что приводит к проблеме. Устраните противоречие, либо удалите или переименуйте один из файлов и попробуйте вновь запустить службу.


На что стоит обратить внимание в конфигурационных файлах

Если вы хотите сохранить оба конфигурационных файла, то проверьте, чтобы значение socket было одинаковым. Также для bind-address должен быть установлен правильный IP адрес. Если к этому серверу подключаются только приложения, которые запущены на этом же сервере, то в качестве значения bind-address нужно прописать localhost или 127.0.0.1

Перезапустите службу mysqld

Попробуйте просто перезапустить службу командой:

sudo systemctl restart mysqld.service

Либо следующим образом, значала узнайте PID (идентификатор) процесса mysql:

ps -ef | grep mysql

Затем выполните следующую команду, в которой вместо [PID]​ укажите число, полученное из предыдущей команды:

kill [PID]

Затем вновь запустите службу:

sudo systemctl start mysqld.service

Неправильные права на файл /run/mysqld/mysqld.sock

У MySQL/MariaDB должно быть достаточно прав для создания и записи в файл /run/mysqld/mysqld.sock (или /var/run/mysqld/mysqld.sock). Можно попробовать решить проблему следующим образом, если файл /run/mysqld/mysqld.sock (или /var/run/mysqld/mysqld.sock - указывайте файл в соответствии с вашими настройками в my.cnf) не существует, то создайте его:

touch /run/mysqld/mysqld.sock

Затем сделайте пользователя mysql владельцем этого файла:

chown mysql /run/mysqld/mysqld.sock

Установите правильные права на этот файл:

sudo chmod 755 /run/mysqld/mysqld.sock

Вновь попробуйте запустить сервис:



sudo systemctl start mysqld.service

Проблемы запуска службы из-за несовместимой настройки apparmor

Если при запуске службы вы получаете ошибку и вы используете профили apparmor, проверьте, чтобы профиль apparmor позволял процессу mysqld иметь доступ в необходимую для него директорию.

Несовместимость может быть вызвана, к примеру, файл сокета для MySQL настроен на сохранение по пути /run/mysqld/mysqld.sock, но в профиле apparmor дано разрешение на /var/run/mysqld/mysqld.sock

Чтобы убедиться, что дело именно в apparmor, попробуйте отключить его:

sudo aa-complain /etc/apparmor.d/*

Если проблема исчезла и служба mysqld запустилась, значит нужно поверить разрешения для mysqld и добавить необходимые пути.

К примеру для показанного примера решением проблемы является добавление в /etc/apparmor.d/usr.sbin.mysqld строк:

/run/mysqld/mysqld.pid rw,
/run/mysqld/mysqld.sock rw,

Служба mysqld не может запуститься из-за отсутствия места на диске

Если ваш диск переполнен, то это может быть причиной невозможности запуска службы, даже если она правильно настроена и ранее нормально работала.

Освободите пространство на диске и перезапустите службу.

Служба mysqld не может запуститься так как порт 3306 используется другой программой

По умолчанию служба mysqld использует порт 3306 если этот порт использует другой процесс, то это является препятствием для запуска MySQL и в конечном счёте появляется рассматриваемая ошибка.

Для решения проблемы выясните, какая служба прослушивает порт 3306. Например, это можно сделать командой:

sudo lsof -Pn -iTCP:3306

А затем остановите эту служу и удалите её из автозагрузки.

Либо можно использовать альтернативный вариант — настроить службу mysqld прослушивать другой, отличный от дефолтного порта. Но это может повлечь необходимость явно указывать порт в любых приложениях, которые подключаются к СУБД MySQL.

Вместо localhost попробуйте использовать 127.0.0.1

Вместо localhost в примерно такой команде:

mysql -u myuser -pmypassword -h localhost mydatabase

Используйте 127.0.0.1:

mysql -u myuser -pmypassword -h 127.0.0.1 mydatabase

(также обратите внимание на отсутствие пробела между -p и mypassword)

Служба mysqld не запускается из-за недоступности файлов баз данных

Ещё одной причиной может стать то, что вы переместили файлы с базами данных, но не изменили пути в соответствующих файлах настройки MySQL. Выполните правильно настройку и перезапустите MySQL или MariaDB.

Неверно указан хост для подключения

Для указания удалённого хоста используется опция -h. Из-за привычки указывать хост после имени пользователя через знак @ (как это делается, например, для SSH), либо указывать удалённый хост без опции -h, команда может оказаться неверной в том плане, что вместо подключения к удалённому хосту, вы пытаетесь подключиться, например, к своей собственной системе, на которой служба MySQL не установлена.

Следовательно, отредактируйте команду, используйте опцию -h или более длинный вариант --host=имя_хоста для указания хоста, к которому вы хотите подключиться.

Кстати, для указания имени пользователя используется опция -u. Если пароль отличается от стандартного, то используется опция -P (заглавная буква). Опция -p (прописная буква) используется для указания базы данных, которая выбирается для использования.

Пример команды:


mysql -h 127.0.0.1 -P 3306 -u root -p <database>

Служба mysqld по умолчанию не добавляется в автозагрузку на некоторых дистрибутивах

Помните, что на некоторых дистрибутивах (например, производных Arch Linux, на Kali Linux) даже после установки MySQL или MariaDB они не добавляются в автозагрузку и не запускаются по умолчанию.

Для запуска службы и её авто старта при последующих включениях компьютера выполните команды:

sudo systemctl start mysqld.service
sudo systemctl enable mysqld.service

Заключение

Итак, основной причиной ошибки «ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2 "No such file or directory")» является незапущенная служба mysqld. Причин того, что указанная служба не запущена может быть множество: от банального факта что служба вообще не установлена, до более серьёзных проблем связанных с переполненностью диска и неправильной настройкой конфигурационных файлов и прав доступа к файлам.

Следовательно, выявите и устраните причину, по которой служба не запущена, а затем запустите службу и ошибка исчезнет.


Рекомендуемые статьи:

3 Комментарии

  1. Некто

    когда служба не запущена, тогда всё понятно.

    А вот вам интересный пример:

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
    root@ыукмук:~/dumps# ps ax | grep mysql
       2105 ?        Sl    14:45 mysqld --user=mysql --init-file=/var/lib/mysql-files/tmp.lIFZNYTGWf --socket=/tmp/tmp.U0qWDGOsFZ/mysqld.sock --pid-file=/tmp/tmp.U0qWDGOsFZ/mysqld.pid

    1. Alexey (Автор записи)

      В выводе можно увидеть параметры, с которыми запущена команда — они странные, но в принципе с подобными опциями (указав существующие директории) вполне можно запустить:

      sudo mysqld --user=mysql --socket=/tmp/mysqld.sock --pid-file=/tmp/mysqld.pid

      И теперь есть два варианта подключения:

      mysql -h localhost -u root # вызывает ошибку, которой посвящена статья
      mysql -h 127.0.0.1 -u root # НЕ вызывает ошибку

      Казалось бы мистика, localhost ≠ 127.0.0.1, но всё очень элементарно.

      Во многих случаях localhost — это намёк на использование сокета UNIX для подключения к процессу сервера MySQL, а 127.0.0.1 устанавливает TCP-соединение. Иногда сокет UNIX находится в неожиданном месте или просто недоступен, что приводит к ошибке «No such file or directory».

      Ну, то есть, процесс MySQL может работать, сокет может существовать, но система не может его найти, а попытка соединения делается именно через сокет — поэтому такое сочетание, служба работает, но недоступна для подключения, вполне себе возможно.

      Варианты:

      1. Используйте TCP-соединение для подключения:

      mysql -h 127.0.0.1 -u root

      2. Исправьте настройки MySQL — просто не указывайте путь до сокета, или укажите его правильно:

      sudo mysqld --user=mysql --socket=/run/mysqld/mysqld.sock --pid-file=/tmp/mysqld.pid

      3. Не делайте то, что приводит к таким странным параметрам при запуске команды. На системах с systemctl достаточно следующей команды для запуска MySQL/MariaDB:

      sudo systemctl start mysql

      То есть ваш случай это скорее «сам себе злобный Буратино» чем реальная проблема.

  2. Сергей

    Очень выручили.  Спасибо огромное!

Добавить комментарий для Некто Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *