MySQL: Can't connect to local server through socket
Сообщение о невозможности подключиться через сокет означает одно из двух: сервер не работает или клиент ищет сокет не там, где он создан. Второе часто бывает после смены дистрибутива или ручной сборки.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Сервер не запущен
Самая частая причина. Сокет создаётся при старте сервера; без него файла нет.
-
Клиент и сервер используют разные пути к сокету
Путь задаётся в настройках и различается между дистрибутивами: /run/mysqld/mysqld.sock, /var/lib/mysql/mysql.sock и другие.
-
Каталог для сокета не создан
Каталог в /run исчезает при перезагрузке. Если unit-файл не создаёт его через
RuntimeDirectory=, сервер не сможет создать сокет.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Существует ли сокет и по какому пути.
sudo ss -xln | grep -i mysqlРаботает ли сервер.
systemctl status mysql --no-pager | head -8Настроенные пути к сокету у клиента и сервера.
sudo grep -rh "^socket" /etc/mysql/ 2>/dev/nullРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Самая частая причина. Сокет создаётся при старте сервера; без него файла нет.
- Как проверить
-
Посмотрите состояние службы.
systemctl status mysql --no-pager | head -8
- Как исправить
- Запустите службу и разберитесь, почему она не работала: сообщение о сокете тут лишь следствие.
- Почему происходит
- Путь задаётся в настройках и различается между дистрибутивами: /run/mysqld/mysqld.sock, /var/lib/mysql/mysql.sock и другие.
- Как проверить
-
Сравните путь в настройках и фактический сокет.
sudo grep -rh "^socket" /etc/mysql/ 2>/dev/null sudo ss -xln | grep -i mysql
- Как исправить
-
Приведите пути к одному значению в разделах клиента и сервера либо передавайте путь ключом при подключении.
mysql --socket=/run/mysqld/mysqld.sock -u root
- Почему происходит
- Каталог в /run исчезает при перезагрузке. Если unit-файл не создаёт его через
RuntimeDirectory=, сервер не сможет создать сокет.
- Как проверить
-
Посмотрите каталог и параметр unit.
ls -ld /run/mysqld 2>/dev/null systemctl show mysql -p RuntimeDirectory
- Как исправить
-
Добавьте
RuntimeDirectory=mysqldв переопределение unit-файла — тогда каталог будет создаваться при каждом запуске.
Пример вывода
Клиент ищет сокет по устаревшему пути. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
$ sudo ss -xln | grep mysql
u_str LISTEN 0 70 /run/mysqld/mysqld.sock 12345 * 0
Связанные ошибки
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- status=233/RUNTIME_DIRECTORY в systemd Код 233/RUNTIME_DIRECTORY: не удалось подготовить каталог службы в /run из RuntimeDirectory=. Права, режим, удаление при остановке.
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- MySQL убит из-за памяти: буферный пул больше доступной памяти MySQL падает сразу после старта или через минуты: размер innodb_buffer_pool_size превышает память машины.
- MySQL: Can't open the mysql.plugin table и повреждение системных таблиц MySQL не запускается: недоступны или повреждены системные таблицы. Права на каталог данных, версия схемы, восстановление.
- MySQL: Too many connections База отказывает в новых подключениях: исчерпан max_connections или предел дескрипторов службы.
- sshd: смена порта не действует из-за ssh.socket Порт в sshd_config игнорируется, потому что адрес слушает systemd через сокет-активацию. Где менять порт.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
Где встречается чаще всего
Источники
- Документация MySQL: подключение через сокет
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено расхождением путей в разделах client и mysqld.