Ошибка MySQL «Can’t connect … /mysqld.sock’ (2)»

В сегодняшней статье я заведу речь о весьма наболевшей проблеме связанной с MySQL сервером установленным на машину под управлением операционной системы на базе ядра Linux.

Итак имеем:

  • машина с операционной системой Ubuntu Server
  • Apache
  • PHP
  • MySQL

проблема следующего характера:

в один прекрасный момент, СУБД MySQL выдаёт примерно следующее сообщение об ошибке при запуске:

Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2).

В самом конце, в скобочках, код ошибки, который меняется по ходу решения проблемы. Во всяком случае «в начале пути», как правило, это двойка, позже были и 13-ый код и 111-ый и т.д.

Сообщение об ошибке, которое говорит: «Не могу соединиться с локальным MySQL сервером через сокет ‘/var/run/mysqld/mysqld.sock’ (2)».

 

Значит сейчас можно попробовать посмотреть объяснение системной ошибки через утилиту perror набрав в консоли следующее:

perror 2

Кстати так же можно почитать информацию и про другие ошибки, которые могут встретиться на пути. В общем давайте идти дальше. Что же делать? Очевидно, что проблема с сокетом, который располагается по следующему адресу: /var/run/mysqld/mysqld.sock
Т.е. MySQL демон не может подключиться к Unix-сокету. А такое может произойти по трём причинам:

  1. Его просто физически нет (не создан);
  2. Кто-то его уже занял;
  3. MySQL пользователь не может получить доступ к сокету по правам доступа.

Для проверки 2-ого варианта можно попробовать узнать, а не занимает ли кто-то этот файл?

sudo lsof /var/run/mysqld/mysqld.sock

В результате можем получить нечто подобное:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
 mysqld 1299 mysql 6u unix 0xf688b840 0t0 7877 /var/run/mysqld/mysqld.sock

сразу видно, кто занял сокет. Или же получаем следующее:

...
 lsof: status error on /run/mysqld/mysqld.sock: No such file or directory
 ...

— т.е. файл просто отсутствует.

В первом случае всё понятно — отключаем приложение, занявшее нужный сокет, либо лезем в конфиг MySQL и ставим другой сокет.
Во втором случае надо создать сокет и/или сделать его доступным для mysql, для этого выполняем следующие действия:

Создаём директорию, в которой должен лежать файл сокета:

sudo mkdir /var/run/mysqld

Создаём сам сокет командой mkfifo.

sudo mkfifo /var/run/mysqld/mysqld.sock

Хотя сокет является тоже файлом, создавать его можно только специальной программой mkfifo.
Рекурсивно устанавливаем владельцем папки mysql (и всего её содержимого) пользователя mysql:

sudo chown -R mysql /var/run/mysqld

После чего делаем рестарт MySQL сервера:

sudo /etc/init.d/mysql restart

В моём случае на этом всё не закончилось. Я для гарантии и большей проверки решил ещё и ребутнуть весь физический сервер. После чего увидел, что при попытке старта СУБД MySQL файл сокета почему то не создаётся.

И как вы думаете в чём же оказалось дело? В простой и банальной нехватки места на жёстком диске! Да! Кто бы мог подумать. При помощи команд ls, df и du просматриваем свободное/занятое место на HDD вашего сервера баз данных и делаем соответствующие выводы. Скорее всего причина может крыться именно здесь. Лично у меня файлы логов были очень большие. В общем почистил место и всё завелось как прежде. Проблема решена.

Итак давайте подведём итог. Куда смотреть в первую очередь и на, что обращать внимание.

  1. Смотрим на коды ошибок, расшифровываем при помощи утилиты perror.
  2. Следим за сокетом расположенным по адресу: /var/run/mysqld/mysqld.sock.
  3. Если надо то создаём его вручную командой mkfifo /var/run/mysqld/mysqld.sock
  4. Поглядываем за правами mysql пользователя, он должен иметь полные права на этот файл. Если требуется, то так же меняем вручную командами chmod и chown.
  5. Можно также заглянуть в журналы логов MySQL, они тут:
      • /var/log/mysql.log
      • /var/log/mysql.err
      • /var/log/mysql/error.log

Если потребуется, то сокет для MySQL так же можно установить так: mysql —socket=/var/lib/mysql/mysql.sock.

Можно попробовать создать символьную ссылку таким образом:

sudo ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock

для исключения проблем с правами доступа. Т.е. файл сокета будет храниться во временной папке, но ссылка на него будет из папки mysql.
У пользователя mysql так же должны быть права на папку /tmp (настройки по умолчанию), если не определена другая временная папка.

Надеюсь у вас получилось. Спасибо за внимание.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Ошибка MySQL «Can’t connect … /mysqld.sock’ (2)»
5 (100%) 2 votes

Оставить комментарий

avatar
  Подписаться  
Уведомление о
Меню

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Рейтинг@Mail.ru