Не удается подключиться к локальному серверу MySQL через сокет '/var/mysql/mysql.sock' (38)


385

У меня большая проблема при попытке подключения к MySQL. Когда я бегу:

/usr/local/mysql/bin/mysql start

У меня есть следующая ошибка:

Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38)

У меня есть mysql.sockпо /var/mysqlкаталогу.

У /etc/my.cnfменя есть:

[client]
port=3306
socket=/var/mysql/mysql.sock

[mysqld]
port=3306
socket=/var/mysql/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M

и у /etc/php.iniменя есть:

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
mysql.default_socket = /var/mysql/mysql.sock

Я перезапустил Apache, используя sudo /opt/local/apache2/bin/apachectl restart

Но у меня все еще есть ошибка.

В противном случае, я не знаю, если это актуально, но когда mysql_config --socketsя получаю

--socket         [/tmp/mysql.sock]

53
MySQL работает?
Дэвид

2
Это, безусловно, объясняет ошибку при попытке подключиться к нему. Как, как упомянул @Romain, есть что-нибудь в логах MySQL (попробуйте /var/log/mysqlили где-то там), что указывает, почему он не работает? Вы получаете ошибку при попытке запустить?
Дэвид

5
Я получал ту же ошибку, но в моем случае я обнаружил, что mysql не запускается, потому что диск заполнен на 100%. /var/log/mysqld.log был полезным.
Йеллавон

4
я предполагаю, что причина, по которой они спрашивают, работает ли она, заключается в том, что сокет создается при запуске службы. Я установил MySQL, но никогда не запускал службу, поэтому файл .sock не существует. введите, service mysqld startесли вы только что установили. hth
changokun

2
Ниже ответ Шимани sudo service mysql startспас меня
Кирен Шива

Ответы:


218

Если ваш файл my.cnf (обычно в папке / etc / mysql / ) правильно настроен с

socket=/var/lib/mysql/mysql.sock

Вы можете проверить, работает ли mysql с помощью следующей команды:

mysqladmin -u root -p status

попробуйте изменить свое разрешение на папку MySQL. Если вы работаете локально, вы можете попробовать:

sudo chmod -R 755 /var/lib/mysql/

это решило это для меня


11
Это помогло мне после того, как я следовал за шагами выше и перезапустил mysqldобслуживание.
Whirlwin

11
Было бы лучше, если бы вы установили разрешения на 755, чтобы только владелец каталога мог писать в него.
Codewaggle

2
Моя проблема была на самом деле просто в том, что в моем хранилище для моего веб-приложения не хватило места! Классический!
Джеймс Т Снелл

3
В моем openSUSE 12.3 my.cnf находится в / etc /.

мы также должны изменить разрешение на /var/log/mysqld.log, спасибо
Allahbakash.G

94

Вы уверены, что вы установили MySQL, а также MySQL сервер ..

Например, чтобы установить сервер mySql, я буду использовать yum или apt для установки инструмента командной строки mysql и сервера:

yum -y install mysql mysql-server (or apt-get install mysql mysql-server)

Включите службу MySQL:

/sbin/chkconfig mysqld on

Запустите сервер MySQL:

/sbin/service mysqld start

Затем установите пароль root для MySQL:

mysqladmin -u root password 'new-password' (with the quotes)

Я надеюсь, что это помогает.


Я использовал brew install mysql
домашний напиток,

2
Я уже установил клиент, мне нужна была команда, sudo apt-get install mysql-serverтогда жизнь была хороша
ErichBSchulz

1
Разве это не вывод Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38) от клиента? Это клиент пытается и не может подключиться, верно? (Я думаю, что оригинальный вопрос нуждается в редактировании, чтобы уточнить это).
MSA

76

Быстрый обходной путь, который мне помог: попробуйте использовать локальный IP-адрес (127.0.0.1) вместо «localhost» в mysql_connect (). Это «заставляет» php подключаться через TCP / IP вместо сокета unix.


Это сработало ... но почему? Разве MySQL не разрешает localhostи не получает 127.0.0.1до того, как пытается подключиться?
Хайме Хаблутцель

3
нет ... при использовании localhost вы не используете интернет-сокет. Вы используете сокет IPC. en.wikipedia.org/wiki/Unix_domain_socket . 127.0.0.1 - это локальный шлейф, который означает, что запрос не будет покидать вашу машину, но он будет использовать TCP / IP, поэтому будет медленнее ...
Master Yogurt

У меня тоже работает. Я на Ubuntu 14.04, HHVM и Nginx.
Майконн

1
Спасибо. это работает для меня, но мне не ясно из ответа, что это за исправление
Натан Бюгенс

Это также необходимо, когда вы подключаетесь к удаленному серверу через ssh-туннель
Tamm

51

Я получил следующую ошибку

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)

Пробовал несколько способов и, наконец, решил это следующим образом

sudo gksu gedit /etc/mysql/my.cnf

модифицированный

#bind-address       = 127.0.0.1

в

bind-address        = localhost

и перезапустил

sudo /etc/init.d/mysql restart

это сработало


У меня была похожая проблема; перешел из ethernet (192.168.220.11) в wifi (192.168.220.12), но привязал адрес привязки к Ethernet Ethernet. Меняется, чтобы localhostисправить это.
Крис Дж

30

Убедитесь, что вы используете mysqld: /etc/init.d/mysql start


3
Или sudo service mysql start|restartдля Ubuntu.
Wtower

18

Чтобы предотвратить возникновение проблемы, вы должны выполнить постепенное отключение сервера из командной строки, а не выключать его.

shutdown -h now

Это остановит работающие службы перед выключением машины.

Основанный на Centos, дополнительный метод для его восстановления снова, когда вы сталкиваетесь с этой проблемой, состоит в том, чтобы переместить mysql.sock:

mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.bak

service mysqld start

Перезапуск службы создает новую запись с именем mqsql.sock


14

Я получил эту ошибку, когда установил задание cron для своего файла. Я изменил права доступа к файлу на 777, но он все еще не работал для меня. Наконец я получил решение. Может быть, это будет полезно для других.

Попробуйте с этой командой:

mysql -h 127.0.0.1 -P 3306 -u root -p

Помните, что -h означает хост , -P означает порт, а -p означает пароль.


Принудительное соединение через TCP / IP вместо использования сокета неэффективно (и требует, чтобы вы включили поддержку TCP / IP локального хоста на сервере, как в этом предыдущем ответе ). Лучше ответ от 2011 года: настройте сервер так, чтобы вы могли правильно использовать сокет.
Квентин

10
-pне означает порт , это означает пароль , вы его перепутали-P
Квентин

Похоже, это более или менее копия этого более раннего ответа
Квентин

Для меня это было просто вопросом определения правильного хоста: mysql -h 127.0.0.1 -u root -p
kghbln

12

Как видно из множества ответов здесь, существует много проблем, которые могут привести к появлению этого сообщения об ошибке при запуске службы MySQL. Дело в том, что MySQL в целом скажет вам, что именно не так, если вы просто загляните в соответствующий файл журнала.

Например, в Ubuntu вы должны проверить /var/log/syslog. Поскольку в этот файл также может входить множество других вещей, вы, вероятно, захотите использовать его grepдля просмотра сообщений mysql и tailтолько для самых последних. Все вместе, это может выглядеть так:

grep mysql /var/log/syslog | tail -50

Не слепо вносите изменения в свою конфигурацию, потому что кто-то другой сказал: «Это сработало для моей системы». Выясните, что на самом деле не так с вашей системой, и вы получите лучший результат гораздо быстрее.


5
+1 Для того, чтобы сделать шаг назад и указать на то, что многие другие ответы даже не учли - что на самом деле увидеть то, что приложение могло сообщить о проблеме, - это гораздо лучший подход, чем слепо торопиться и вносить изменения, которые не могут даже быть применимым ...!
SlySven

Ах, значит, он использует неправильно .cnf. Что объясняет его. Теперь я могу перестать пробовать случайные вещи и заняться реальной проблемой. Спасибо.
Synetech

11

Другой обходной путь - отредактировать /etc/my.cnf и включить хост в раздел [client].

 [client]
 #password       = your_password
 host            = 127.0.0.1
 port            = 3306
 socket          = /var/run/mysql/mysql.sock

А затем перезапустить службу MySQL.

Этот обходной путь был протестирован в: Версия сервера: 5.5.25a-log Исходный дистрибутив


добавление раздела [client] рекомендуется, если его еще нет в my.cnf
Cris

7

У меня была та же самая проблема, и это было вызвано обновлением драйверов mysql, когда сервер mysql работал. Я исправил это, просто перезапустив mysql и apache2:

sudo service mysql stop

sudo service mysql start

остановка службы sudo apache2

sudo service apache2 start


В моем случае mysqlне работает. Я побежал sudo service mysql startпосле запуска, sudo service mysql statusчтобы убедиться, что он не работает.
ТАСС

6

В моем случае я использовал Centos 5.5. Я обнаружил, что проблема была в том, что служба mysql была остановлена ​​каким-то образом. Поэтому я запустил службу mysql с помощью команды:

 /etc/init.d/mysqld start

Так что .. глупая ошибка.


6

Если все работало нормально, и вы только начали видеть эту ошибку, прежде чем делать что-то еще, убедитесь, что у вас нет свободного места на диске:

df -h

Если том, на котором создается mysql.sock , используется на 100%, MySql не сможет его создать, и это будет причиной этой ошибки. Все, что вам нужно сделать, это удалить то, что не нужно, например, старые файлы журнала.



5
sudo service mysql start

Это должно послужить вам просто отлично. Возможно, вы изменили некоторые команды, которые влияли на конфигурацию mysql.


или systemctl start mariadb.serviceв Fedora 22 или RedHat 7. После этого можно установить пароль root.
Младший Mayhé

5

Есть много решений этой проблемы, но в моей ситуации мне просто нужно было исправить ДАТУ на машине / сервере ( Ubuntu 16.04 Server ).

я) Проверьте дату вашего сервера и исправьте ее.

II) Выполнить sudo /etc/init.d/mysql restart

Это должно начать.


4

Я получал сообщение об ошибке, потому что я запускал MAMP, а мой файл .sock находился в другом месте. Я просто добавил символическую ссылку, где приложение считало, что это должно быть, которая указывает на то, где она на самом деле была, и она работала как шарм.


Как добавить символическую ссылку, если приложение считало, что оно должно быть там, где оно было на самом деле?
Гилберто Ибарра

4

Я также обнаружил, что это проблема с разрешениями. Я сравнил файлы MySQL с работающей установкой (обе на Debian 6 squeeze) и мне пришлось внести следующие изменения в владельца (гдеmydatabase есть какая-либо база данных).

Владение mysql:mysql:

chown mysql:mysql /var/lib/mysql
chown mysql:mysql /var/lib/mysql/ib*
chown mysql:mysql /var/lib/mysql/mydatabase
chown mysql:mysql /var/lib/mysql/mydatabase/*
chown mysql:mysql /var/lib/mysql/mysql/* 

Владение mysql:root:

chown mysql:root /var/lib/mysql/mysql
chown mysql:root /var/run/mysqld 

Владение mysql:adm:

chown mysql:adm /var/log/mysql
chown mysql:adm /var/log/mysql.err
chown mysql:adm /var/log/mysql.log* 

4

Для меня - это был просто случай, когда MySQL долго загружался. У меня есть более 100 000 таблиц в одной из моих баз данных, и она в конце концов запустилась, но, очевидно, в этом случае это займет много времени.


3

Если вы используете микро версию AWS (Amazon Web Services), то это проблема памяти. Когда я побежал

mysql

из терминала было бы сказать

ERROR 2002 (HY000): Can't connect to local MySQL server through socket /var/run/mysqld/mysqld.sock' (111)

Поэтому я попробовал следующее, и это просто не получилось.

service mysqld restart

После долгих поисков я обнаружил, что вам нужно создать файл подкачки для MySQL, чтобы иметь достаточно памяти. Инструкции перечислены: http://www.prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html .

Затем я смог перезапустить mysqld.


У меня была такая же проблема на экземпляре «микро» сервера AWS, и я могу подтвердить, что создание файла подкачки DID исправило «ОШИБКА 2002 (HY000): невозможно подключиться к локальному серверу MySQL через сокет / var / run / mysqld / mysqld .sock '(111) "проблема. Спасибо @ jth_92!
Konaras

3

вы всегда можете запустить сервер mysql, указав расположение файла mysql.sock с помощью --socketопции

mysql --socket=/var/mysql/mysql.sock 

Это будет работать, даже если местоположение файла сокета указано в другом месте в файле my.cnf.


3

Для тех, чье решение не работает, попробуйте:

cd /etc/mysql

проверить , если my.cnf присутствует

nano my.cnf

и убедитесь, что у вас есть только один bind-адрес:

bind-address = 127.0.0.1

Если нет, то это может быть проблемой, просто выйдите из nano и сохраните файл.

а также service mysql start

обратите внимание, что если у вас нет nano (это текстовый редактор), просто установите его apt-get install nanoи просто нажмите Ctrl + X для выхода, не забудьте сказать Y, чтобы сохранить и использовать тот же файл)


К сожалению, это не сработало. Это просто говорит о том, что только локальный компьютер может получить доступ к mysql. Нет удаленных подключений.
стивен

3

У меня тоже была эта проблема при попытке запустить сервер, поэтому многие ответы здесь, в которых просто говорится, чтобы запустить сервер, не сработали. Первое, что вы можете сделать, это выполнить следующее, чтобы увидеть, есть ли какие-либо ошибки конфигурации:

/usr/sbin/mysqld --verbose --help 1>/dev/null

У меня была одна ошибка, которая обнаружилась:

160816 19:24:33 [Note] /usr/sbin/mysqld (mysqld 5.5.50-0ubuntu0.14.04.1-log) starting as process 9461 ...
160816 19:24:33 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
160816 19:24:33 [Note] Plugin 'FEDERATED' is disabled.
160816 19:24:33 [ERROR] /usr/sbin/mysqld: unknown variable 'innodb-online-alter-log-max-size=4294967296'
160816 19:24:33 [ERROR] Aborting

Простое grep -HR "innodb-online-alter-log-max-size" /etc/mysql/показало мне, какой именно файл содержит оскорбительную строку, поэтому я удалил эту строку из файла.

Затем, проверяя мой /var/log/mysql/error.logфайл, я имел:

InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 671088640 bytes!
160816 22:46:46 [ERROR] Plugin 'InnoDB' init function returned error.
160816 22:46:46 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
160816 22:46:46 [ERROR] Unknown/unsupported storage engine: InnoDB
160816 22:46:46 [ERROR] Aborting

Исходя из этого вопроса, принятое решение не будет работать, потому что я даже не смог запустить сервер, поэтому я следовал тому, что было сказано в некоторых комментариях, и удалил мой /var/lib/mysql/ib_logfile0и/var/lib/mysql/ib_logfile1 файлы.

Это позволило запустить сервер, и я смог подключиться и выполнить запросы, однако, проверяя мой файл журнала ошибок, он быстро заполнялся несколькими десятками тысяч строк, например так:

160816 22:52:15  InnoDB: Error: page 1415 log sequence number 82039318708
InnoDB: is in the future! Current system log sequence number 81640793100.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: for more information.

Основываясь на предложении здесь , чтобы исправить это, я сделал mysqldump и восстановил все базы данных (см. Ссылку для нескольких других решений).

$ mysqldump -u root -p --allow-keywords --add-drop-database --comments --hex-blob --opt --quote-names --databases db_1 db_2 db_3 db_etc > backup-all-databases.sql
$ mysql -u root -p < backup-all-databases.sql

Похоже, что сейчас все работает так, как ожидалось.


Проверка /var/log/mysql/error.logпомогла в моем случае. Это было [ERROR] Can't init tc logбыстро исправлено с помощью следующего ответа: dba.stackexchange.com/a/185006/163583
Juraj.Lorinc

2

Добавление

--protocol=tcp 

к списку праматоров в связи с чем у меня работали.



2

Я столкнулся с этим вопросом сегодня. Ни один из этих ответов не дал исправления. Мне нужно было выполнить следующие команды (находятся здесь https://stackoverflow.com/a/20141146/633107 ) для запуска моей службы mysql:

sudo /etc/init.d/mysql stop
cd /var/lib/mysql/
ls ib_logfile*
mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak
... etc ...
/etc/init.d/mysql restart

На это частично указывали следующие ошибки в /var/log/mysql/error.log:

140319 11:58:21 InnoDB: Completed initialization of buffer pool
InnoDB: Error: log file ./ib_logfile0 is of different size 0 50331648 bytes
InnoDB: than specified in the .cnf file 0 5242880 bytes!
140319 11:58:21 [ERROR] Plugin 'InnoDB' init function returned error.
140319 11:58:21 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140319 11:58:21 [ERROR] Unknown/unsupported storage engine: InnoDB
140319 11:58:21 [ERROR] Aborting

Я также видел ошибку переполнения диска, но только при выполнении команд без sudo. Если проверка разрешений не удалась, она сообщает о переполнении диска (даже если ваш раздел даже близко не заполнен).


2

CentOS 7, 64 бит. Свежая установка.
В моем случае ошибка была из-за того, что у меня не был установлен правильный сервер MySQL и клиент MySQL.
Используя yum, я удалил mariadbи MySQL-сообщество редакции. Я загрузил rpm для клиента и сервера с официального сайта MySQL и установил сервер и клиент.

При установке сервера мне было показано, что пароль к учетной записи root для MySQL хранится в файле, который я могу просмотреть sudo cat /root/.mysql_secret.

Поэтому после установки клиента и сервера я проверил, работает ли MySQL (я думаю, что перед этим перезагрузился), sudo service mysql statusи получил результат.

MySQL работает (2601) [OK]

Я вошел в MySQL с помощью пароля из .mysql_secret файла:
mysql -uroot -pdxM01Xfg3DXEPabpf. Обратите внимание, что dxM01Xfg3DXEPabpfэто пароль, указанный в файле .mysql_secret.

и затем набрал, введите следующую команду в приглашении mysql, чтобы изменить пароль root:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('somePassword');

С этого момента все работало нормально.


1
тот же случай на RHEL6U6 с версией сервера: 5.6.23-enterprise-commercial-advanced.
HCD


2

Это прямо не ответит на ваш вопрос, но подмножество, а именно использование PythonAnywhere. Я продолжал наталкиваться на этот вопрос, когда искал исправление, поэтому добавляю его сюда в надежде, что оно поможет другим в моей ситуации.


PythonAnywhere решил изменить имена хостов соединения с базой данных, чтобы повысить эффективность и надежность, как подробно описано здесь :

Официальное имя хоста, которое вы должны использовать для подключения к экземпляру базы данных MySQL вашей учетной записи, изменилось с mysql.server на yourusername .mysql.pythonanywhere-services.com . Это обходит часть нашей инфраструктуры, в которой в последние недели появились проблемы, и она должна быть намного более эффективной и надежной, чем прежняя версия.

Следовательно, вам нужно обновить имя вашего хоста до значения, выделенного выше.


2

У меня только что была эта проблема. после дня окончательной проверки я получил ответ, что файл mysql.sock создается при запуске MariaDB и удаляется при выключении MariaDB. Это не будет существовать, если MariaDB не работает. может быть, вы не установили MariaDB. ВЫ МОЖЕТЕ СЛЕДОВАТЬ ЗА РУКОВОДСТВОМ НИЖЕ: https://www.linode.com/docs/databases/mariadb/how-to-install-mariadb-on-centos-7 BEST


1

У меня была эта ошибка сокета, и это в основном сводилось к тому, что MySQL не работал. Если вы запускаете новую установку, убедитесь, что вы установили 1) системный пакет и 2) установщик панели (mysql.prefPane). Установщик панели позволит вам перейти в «Системные настройки» и открыть MySQL, а затем запустить экземпляр.

Обратите внимание, что при новой установке мне нужно было перезагрузить компьютер, чтобы изменения вступили в силу. После перезагрузки я запустил новый экземпляр и смог без проблем открыть соединение с localhost.

Также следует отметить, что у меня, по-видимому, были установлены предыдущие версии MySQL, но я удалил панель, что облегчает запуск экземпляра MySQL для пользователей Mac.

Хорошая ссылка для этого процесса переустановки: http://www.coolestguyplanettech.com/how-to-install-php-mysql-apache-on-os-x-10-6/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.