Can't connect to local MySQL server through socket


Подхожу сегодня к терминалу, а там ничего не работает. В чем же дело, ― подумал я, ведь еще недавно все работало нормально. Как выяснилось, причиной всему стала ошибка 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock', которая почему-то возникла после перезагрузки машины, от которой работает терминал. Начал разбираться и пришел к выводу, что эта ошибка возникает в четырех случаях:
• если файл /var/run/mysqld/mysqld.sock фактически не существует (удален, перемещен и т.п.),
• если пользователь, от имени которого работает MySQL, не имеет прав доступа к файлу /var/run/mysqld/mysqld.sock,
• если пользователь, от имени которого работает MySQL, не имеет прав на использование /tmp,
• если сокет уже кто-то зарезервировал для себя перед тем, как загрузился MySQL.

Для начала проверяем последний вариант. Делается это следующим запросом:

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

Если в ответе сказано, что такого файла не существует, то это первый вариант и нужно его создать (далее расскажу, как), если же в ответ Вы получите имя пользователя, отличное от «mysql» (хотя, это зависит от того, под кем все это дело работает), то это таки последний вариант и лечится он усмирением того, кто захватил сокет.

А теперь вернемся к варианту с отсутствием файла. Для начала попробуем создать папку, на случай, если она тоже каким-то чудным образом пропала.

sudo mkdir /var/run/mysqld

Если этот шаг возвращает ошибку с сообщением о том, что папка уже существует, то его можно пропустить. По сути дела, сокет ― это файл, но создать его можно лишь с помощью специальной команды:
sudo mkfifo /var/run/mysqld/mysqld.sock

Ну и под самый конец процесса назначаем владельцем всей папки, содержащей вышеупомянутый файл, пользователя «mysql» (или того, под кем у Вас работает MySQL-сервер):
sudo chown -R mysql /var/run/mysqld

Эта же команда поможет и в том случае, если и папка и файл существуют, но нужный пользователь не имеет к ним права доступа. По завершению экспериментов перезапускаем MySQL-сервер следующей командой:
sudo service mysqld restart

Вот так в несколько простых шагов проблема была решена, а вот с причинами ее возникновения я еще пока не разобрался. Странно ведь, что терминал в течение длительного времени работал бесперебойно, а тут вдруг раз и пропал файл сокета.


29.06.2013, 23:05
  MySQL, ошибка.
Просмотров: 4415.
6