#Что означает ошибка
Can't connect through socket
Ошибка 2002 «Can't connect to local MySQL server through socket» означает, что клиент пытается подключиться к MySQL через Unix-сокет (файл), но сервер либо не запущен, либо сокета нет по указанному пути. При подключении к localhost клиенты MySQL по умолчанию используют сокет, а не TCP, поэтому ошибка не зависит от открытости порта 3306.
Типичные ситуации: служба остановилась (нехватка памяти, кончилось место, ошибка в конфигурации), поменялся путь сокета после обновления или в разных конфигах клиента и сервера указаны разные пути.
Запустите mysqld и проверьте путь сокета.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Сервер остановленmysqld. | Проявляется как «Can't connect through socket» или близкий по смыслу сбой. | Запустите. |
| Путь сокетаКонфиг. | Проявляется как «Can't connect through socket» или близкий по смыслу сбой. | Исправьте. |
| ПраваСокет. | Проявляется как «Can't connect through socket» или близкий по смыслу сбой. | Проверьте. |
| ПамятьOOM. | Проявляется как «Can't connect through socket» или близкий по смыслу сбой. | Освободите. |
#Пошаговое решение
- Запустите MySQLПодключитесь к серверу через SSH или консоль провайдера и посмотрите
systemctl status mysqlилиmariadbв зависимости от установки. Если службаfailed, откройте её журнал и устраните первичную причину до запуска. Если службаactive, переходите к проверке пути сокета. - Проверьте путь к сокетуВ терминале выполните
sudo ss -lxnp | grep -E "mysql|maria"и найдите текущий UNIX-сокет. Сверьте путь с настройками клиентаmysql --help | grep socketиsocketв конфигурации сервера; старый путь из другой версии MySQL может сохраняться в приложении. - Подключитесь по TCPЕсли сервер разрешает локальный TCP, проверьте
sudo ss -ltnp | grep 3306и выполнитеmysql -h 127.0.0.1 -P 3306 -u имя_пользователя -p. Если TCP работает, аlocalhostнет, исследуйте только сокет/путь. Не открывайте 3306 во внешний Интернет ради этой проверки. - Прочитайте журналЕсли MySQL не запускается, посмотрите
sudo journalctl -u mysql -n 100 --no-pagerлибо журнал MariaDB и найдите первую ошибку: порт, права, место или повреждение InnoDB. Не удаляйте сокет и файлы данных наугад; при повреждении сначала готовьте резервную копию. - Проверьте место и памятьВыполните
df -h,df -i,free -hи проверьте OOM-сообщения ядра; если закончились место или память, исправляйте причину их нехватки. После восстановления запустите службу по утверждённой процедуре и повторите соединение тем же пользователем.
#Проверка службы
Выполните systemctl status mysql (или mariadb). Если служба не запущена, попробуйте systemctl start mysql и изучите журнал: /var/log/mysql/error.log или journalctl -u mysql. Часто причина — нехватка оперативной памяти (процесс убит OOM-killer) или переполненный диск.
#Путь сокета
Узнайте путь сокета в конфигурации сервера (параметр socket в разделе [mysqld]) и клиента (разделы [client] и [mysql]). Они должны совпадать. Если сервер работает, а клиент ищет другой файл, укажите нужный путь в параметре --socket либо подключайтесь по TCP: mysql -h 127.0.0.1 -P 3306.
#Для PHP-приложений
В конфигурации сайта используйте тот же сокет или хост 127.0.0.1. В php.ini параметры pdo_mysql.default_socket и mysqli.default_socket должны указывать на существующий файл. После смены конфигурации перезапустите PHP-FPM и веб-сервер.
sudo systemctl status mysqlsudo grep -r "socket" /etc/mysql/mysql -h 127.0.0.1 -P 3306 -u root -p