MySQL Ошибка 2002 (HY000): Can't connect to local MySQL server through socket
Механизм локального межпроцессного взаимодействия (IPC) через Unix Socket
При подключении локальных клиентов к серверу MySQL с указанием хоста localhost клиентская библиотека по умолчанию использует механизм локальных доменных сокетов Unix (Unix Domain Socket) вместо сетевого TCP/IP стека. Системная ошибка MySQL Error 2002 (SQLSTATE HY000): «Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)» или «(111 Connection refused)» означает, что файл сокета физически отсутствует в указанном каталоге, либо процесс СУБД завершил свою работу и закрыл сокет.
Бизнес-риски
Полная недоступность локальных сайтов и сервисов на сервере, сбой запуска регламентных задач по cron (дампы, синхронизации).
Диагностическое дерево причин ошибки 2002
| Код системной ошибки Linux | Текст ошибки | Реальная первопричина |
|---|---|---|
Error (2) | No such file or directory | Служба mysqld выключена / упала, либо пути сокета в my.cnf и клиенте расходятся. |
Error (13) | Permission denied | У пользователя веб-сервера нет прав на чтение/запись в каталог сокета. |
Error (111) | Connection refused | Файл сокета остался на диске после краша, но процесс СУБД не слушает его. |
Регламент проверки службы и восстановления сокета
Шаг 1: Проверка статуса и журнала ошибок службы MySQL
# 1. Проверка текущего статуса службы:
sudo systemctl status mysql
# (или sudo systemctl status mariadb)
# 2. Если служба в статусе failed / inactive -> запустите ее:
sudo systemctl start mysql
# 3. Если запуск падает -> изучите системный журнал ошибок:
sudo tail -n 50 /var/log/mysql/error.logШаг 2: Проверка и создание каталога сокета с корректными правами
# 1. Проверка реального расположения сокета в конфигурации my.cnf:
sudo grep -rn "socket" /etc/mysql/
# 2. Создание стандартного каталога под сокет (если он был удален):
sudo mkdir -p /var/run/mysqld/
sudo chown -R mysql:mysql /var/run/mysqld/
sudo chmod 777 /var/run/mysqld/
# 3. Перезапуск службы:
sudo systemctl restart mysql
# 4. Проверка появления файла сокета:
ls -la /var/run/mysqld/mysqld.sock
# Должен иметь тип 's': srwxrwxrwx 1 mysql mysql ... mysqld.sockШаг 3: Синхронизация путей сокета между MySQL, PHP и консольным клиентом
Частая проблема — клиент ищет сокет в /tmp/mysql.sock, а сервер создает его в /var/run/mysqld/mysqld.sock:
# 1. В конфигурационном файле /etc/mysql/my.cnf синхронизируйте секции [mysqld] и [client]:
[mysqld]
socket = /var/run/mysqld/mysqld.sock
[client]
socket = /var/run/mysqld/mysqld.sock
# 2. В файле php.ini задайте точный путь по умолчанию:
# pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock
# mysqli.default_socket = /var/run/mysqld/mysqld.sock
# 3. Альтернативный обход через символическую ссылку (Symlink):
sudo ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sockТиповые ошибки администраторов
- Попытка создать файл сокета вручную через touch: Обычный пустой файл не является сокетом ядра Linux. Сокет создается ТОЛЬКО самим процессом
mysqldчерез системный вызовbind(). - Игнорирование переполнения диска: Если на диске 100% заполнено место (Got error 28), MySQL не сможет создать PID и сокет-файл при старте и аварийно упадет.
Специалисты ITSTM локализуют причину краша службы в error.log, восстановят целостность структуры и обеспечат бесперебойный автозапуск.
Частые вопросы (FAQ)
Как принудительно заставить клиента подключаться по TCP, а не через сокет?
Укажите IP-адрес 127.0.0.1 вместо строки 'localhost' в параметрах подключения (например: mysql -h 127.0.0.1 -P 3306 -u root -p).
Почему сокет удаляется после каждой перезагрузки сервера?
Каталог /var/run смонтирован в tmpfs. Служба systemd должна содержать директиву RuntimeDirectory=mysqld в файле mysql.service для автоматического создания каталога при старте.
Что делать, если при запуске MySQL выдает 'Address already in use' на сокете?
Удалите старый зависший файл сокета командой sudo rm -f /var/run/mysqld/mysqld.sock и перезапустите службу.
Как проверить, слушает ли MySQL сокет прямо сейчас?
Выполните команду: sudo lsof -U | grep mysqld.sock или ss -xl | grep mysqld.