Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
MYSQL-ERR-2002 Linux / DevOps

MySQL Ошибка 2002 (HY000): Can't connect to local MySQL server through socket

Обновлено: 21.08.2026  ·  Официальная база знаний

Механизм локального межпроцессного взаимодействия (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 и сокет-файл при старте и аварийно упадет.
База данных MySQL не запускается и сокет-файл отсутствует?
Специалисты ITSTM локализуют причину краша службы в error.log, восстановят целостность структуры и обеспечат бесперебойный автозапуск.
Практический опыт инженера: Если MySQL аварийно завершается при старте без внятных записей в error.log, проверьте системный журнал ядра dmesg | grep mysqld — чаще всего процесс убивается OOM-Killer из-за завышенного innodb_buffer_pool_size.

Частые вопросы (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.