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


126

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

OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")

Однако я всегда могу подключиться к MySQL, запустив программу командной строки mysql. A ps aux | grep mysqlпоказывает, что сервер работает, и stat /tmp/mysql.sockподтверждает, что сокет существует. Кроме того, если я открою отладчик в exceptпункте этого исключения, я смогу надежно подключиться с теми же параметрами.

Эта проблема воспроизводится довольно надежно, однако она не выглядит на 100%, потому что каждый раз в синюю луну мой набор тестов действительно запускается без появления этой ошибки. Когда я пытался бежать с sudo dtrussним, не воспроизводилось.

Весь клиентский код написан на Python, хотя я не могу понять, насколько это актуально.

При переключении на использование хоста 127.0.0.1возникает ошибка:

DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)

1
Возможно ли, что вы каким-то образом попадаете в базу данных с множеством одновременных подключений? Может быть, попробовать увеличить max_connectionsв вашем MySQL conf файле?
dgel 01

2
делает mysql -h 127.0.0.1работу из командной строки? Я не уверен, что ваш сервер mysql действительно прослушивает TCP-порт.
Эли

1
Вы уверены, что у вас есть подходящие версии клиентских библиотек Python MySQL для вашей версии MySQL? Кроме того, mysql -h localhostнадежно ли работает?
Old Pro

2
Регистрирует ли MySQL что-нибудь в журнале ошибок? Также проверьте права доступа к файлам в /tmp/mysql.sock и в каталоге данных mysql. Возникают ли ошибки также при запуске набора тестов от имени пользователя root (sudo)?
Эрик Седерстранд

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

Ответы:


152
sudo /usr/local/mysql/support-files/mysql.server start 

Это сработало для меня. Однако, если это не сработает, убедитесь, что mysqld запущен, и попробуйте подключиться.


1
Я потратил более 2 недель (даже не шучу), и это самое близкое, что мне нужно, чтобы наконец-то подключиться. Однако он застрял при запуске mysql ..... Но спасибо, хороший пост!
L. Klotz

2
sudo: /usr/local/mysql/support-files/mysql.server: команда не найдена. Зачем?
Шьям Пиллай,

1
Почему после sudo стоит двоеточие? Проверить, существует ли путь
Pratyay

Или, если mysql установлен вместе с homebrew: sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start
Majoren 01

1
Сервер завершил работу без обновления файла PID (/var/lib/mysql/Saranshs-MacBook-Pro.local.pid).
saran3h

90

Соответствующий раздел руководства MySQL находится здесь . Я бы начал с выполнения перечисленных здесь шагов отладки.

Также помните, что localhost и 127.0.0.1 в этом контексте не одно и то же:

  • Если для хоста установлено значение localhost, используется сокет или канал.
  • Если для хоста задано значение 127.0.0.1, клиент вынужден использовать TCP / IP.

Так, например, вы можете проверить, прослушивает ли ваша база данных TCP-соединения vi netstat -nlp. Кажется вероятным, что он прослушивает TCP-соединения, потому что вы говорите, что это mysql -h 127.0.0.1работает нормально. Чтобы проверить, можете ли вы подключиться к своей базе данных через сокеты, используйте mysql -h localhost.

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


Хотя в целом соблюдение установленных диагностических процедур является хорошей идеей, если вы прочитаете вопрос (и процедуры), вы увидите, что процедуры были выполнены и определили, что это не проблема с сервером MySQL. Это что-то специально предназначенное для клиента Python, поскольку весь другой доступ через сокет работает нормально, включая другой доступ из Python.
Old Pro

1
Какое странное голосование против. Я опубликовал установленную процедуру по нескольким причинам: (1) другие люди размещали только часть установленной процедуры, и лучше систематизировать отладку, (2) возникла некоторая путаница с localhost vs 127.0.0.1 и (3 ) другие люди с таким же признаком «Не удается подключиться к локальному серверу mysql», скорее всего, наткнутся на этот вопрос. Я знаю, что это, скорее всего, клиент Python, поэтому я попросил дополнительную информацию, например, о том, как создается соединение.
jtoberon

4
+1 Я получал эту ошибку при попытке подключиться к mysql через туннель ssh (используя localhostв качестве хоста). Изменение на 127.0.0.1исправленное.
krock

Для записи, это устранило мою проблему: «Не могу подключиться к локальному серверу MySQL через сокет '/tmp/mysql.sock'».
proinsias

Спасибо! это сработало для меня это исправление при попытке подключиться к контейнеру docker maridb.
Люсьен Опря,

86

Для меня проблема заключалась в том, что я не запускал сервер mysql. Сначала запустите сервер, а затем выполните mysql.

$ mysql.server start
$ mysql -h localhost -u root -p

28

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

при запуске вашего терминала

mysql_config --socket

это даст вам ваш путь к файлу sock. выберите этот путь и используйте его в параметре DATABASES HOST.

Что вам нужно сделать, это указать

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'test',
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',
        'PORT': '',
    },
}

НОТА

также запустите, which mysql_configесли у вас каким-то образом установлено несколько экземпляров сервера mysql на машине, вы можете подключиться не к тому.


Что делать, если ваш файл носка отсутствует?
AlxVallejo

купить другую пару? j / k, что означает, что служба mysql не запущена. запустить / перезапустить mysql
Фрэнсис Яконьелло

6
В моем случае изменение HOST с "localhost" на "127.0.0.1" решило проблему.
lucaswxp

@lucaswxp: В моем случае мне нужно сменить localhost с доменным именем
Аншул Мишра

19

Я просто изменил HOSTс localhostна, 127.0.0.1и он отлично работает:

# settings.py of Django project
...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '',
},
...

4
Было бы хорошо знать , что файл , который вы изменили , и где он находится
Empi

1
В settings.pyпроекте.
Sirbito X

11

Когда, если вы потеряете свой демон mysql в Mac OSx, но присутствует в другом пути, например, в частном / var, выполните следующую команду

1)

ln -s /private/var/mysql/mysql.sock /tmp/mysql.sock

2) перезапустите соединение с mysql с помощью:

mysql -u username -p -h host databasename

работает также для mariadb


9

Запустите приведенный ниже cmd в терминале

/ USR / местные / MySQL / бен / mysqld_safe

введите описание изображения здесь

Затем перезапустите машину, чтобы изменения вступили в силу. Оно работает!!


1
Это сработало для меня на iMac под управлением High Sierra, который был обновлен до Mojave. Должно быть, произошло то, что файл mysql.sock был в tmp и удален при обновлении. Поскольку сокет создается автоматически при запуске MySQL, вам просто нужно убедиться, что MySQL выключен, а затем запустить его в безопасном режиме, как указано выше. Волшебным образом появляется файл mysql.sock.
Дэвид

8

Проверьте количество открытых файлов для процесса mysql с помощью команды lsof.

Увеличьте лимит открытых файлов и запустите снова.


Я уже сталкивался с этим раньше, и вы не сможете сделать это через свой файл .cnf. вам может действительно потребоваться ulimitувеличить количество открытых файлов, которые разрешено открывать вашему клиенту и серверу. если вы используете последнюю версию ubuntu, это может потребовать редактирования сценария выскочки mysql в / etc / init, но, надеюсь, вы можете просто сделать это в файле .cnf.
Underrun

8

После попытки нескольких из этих решений и безуспешных попыток у меня сработало следующее:

  1. Перезагрузите систему
  2. запуск mysql.server
  3. Успех!

7

Это может быть одна из следующих проблем.

  1. Неправильная блокировка mysql. Решение: вам нужно найти правильный сокет mysql,

mysqladmin -p переменные | grep socket

а затем введите его в свой код подключения к базе данных:

pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock")

/tmp/mysql.sock возвращается из grep

2.Неправильное решение для порта mysql: вам необходимо найти правильный порт mysql:

mysqladmin -p variables | grep port

а затем в вашем коде:

pymysql.connect(db='db', user='user', passwd='pwd', host='localhost', port=3306)

3306 - это порт, возвращаемый командой grep

Думаю, первый вариант решит вашу проблему.


6

Для тех, кто обновился с 5.7 до 8.0 через homebrew, эта ошибка, скорее всего, вызвана незавершенным обновлением. В моем случае mysql.server startя получил следующую ошибку:

ОШИБКА! Сервер завершил работу без обновления файла PID

Затем я проверил файл журнала cat /usr/local/var/mysql/YOURS.err | tail -n 50и обнаружил следующее:

InnoDB: обновление после сбоя не поддерживается.

Если вы находитесь в той же лодке, сначала установите mysql@5.7через homebrew, остановите сервер, а затем снова запустите систему 8.0.

brew install mysql@5.7

/usr/local/opt/mysql@5.7/bin/mysql.server start
/usr/local/opt/mysql@5.7/bin/mysql.server stop

Затем,

mysql.server start

Это заставит ваш MySQL (8.0) снова заработать.


Я ERROR! The server quit without updating PID fileснова получаю то же самое .
awebartisan

В моем случае я только что установил mysql@5.7 и удалил последнее. Все завелось. База данных не удалена.
Эндрю Лука

4

Мне кажется, я видел такое же поведение некоторое время назад, но не могу вспомнить детали.
В нашем случае проблема заключалась в том, что тестер инициализирует соединения с базой данных относительно первого требуемого взаимодействия с базой данных, например, путем импорта модуля в settings.py или некоторого __init__.py. Я попытаюсь найти дополнительную информацию, но это уже может стать сигналом для вашего дела.


4

Убедитесь, что ваш / etc / hosts есть 127.0.0.1 localhostв нем, и он должен работать нормально


Удивительно (с уважением), что это отсортировало его для меня - проверив это, я обнаружил, что при попытке настроить webdav Mavericks добавил несколько дополнительных (полностью искаженных) строк в мой файл хоста, в том числе ту, которая переназначила localhost.
rob_was_taken 02 янв.15

4

У меня есть две хитрые догадки на этот счет

Гипотеза №1

Рассмотрите возможность невозможности доступа к /tmp/mysql.sockфайлу. Когда я настраиваю базы данных MySQL, я обычно подключаю сайт с файлом сокета /var/lib/mysql. Если вы войдете в mysql как root@localhost, сеансу вашей ОС потребуется доступ к /tmpпапке. Убедитесь, что у вас /tmpесть правильные права доступа в ОС. Кроме того, убедитесь, что пользователь sudo всегда может читать файл в формате /tmp.

Гипотеза №2

Доступ к mysql через 127.0.0.1может вызвать некоторую путаницу, если вы не обращаете внимания. Как?

Если вы подключаетесь к MySQL с помощью командной строки, 127.0.0.1вам может потребоваться указать протокол TCP / IP.

mysql -uroot -p -h127.0.0.1 --protocol=tcp

или попробуйте DNS-имя

mysql -uroot -p -hDNSNAME

Это позволит избежать входа в систему как root@localhost, но убедитесь, что вы root@'127.0.0.1'определили.

В следующий раз, когда вы подключитесь к MySQL, запустите это:

SELECT USER(),CURRENT_USER();

Что это вам дает?

  • USER () сообщает, как вы пытались пройти аутентификацию в MySQL.
  • CURRENT_USER () сообщает, как вам была разрешена аутентификация в MySQL

Если эти функции возвращают те же значения, значит, вы подключаетесь и аутентифицируетесь, как и ожидалось. Если значения отличаются, вам может потребоваться создать соответствующего пользователя root@127.0.0.1.



3

если вы получите сообщение об ошибке, как показано ниже:

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

Затем просто найдите местоположение вашего файла mysqld.sock и добавьте его в «HOST».

Как будто я использую xampp в Linux, поэтому мой mysqld.sockфайл находится в другом месте. так что это не работает ' /var/run/mysqld/mysqld.sock'

DATABASES = {

    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'asd',
        'USER' : 'root',
        'PASSWORD' : '',
        'HOST' : '/opt/lampp/var/mysql/mysql.sock',
        'PORT' : ''
    }
}

2

Убедитесь, что ваш mysql не достиг максимального количества подключений или не находится в каком-то цикле загрузки, как это часто бывает, если настройки в my.cnf неверны.

Используйте ps aux | grep mysql, чтобы проверить, меняется ли PID.


2

Слишком долго смотрел в Интернете, чтобы не вносить свой вклад. После попытки ввести приглашение mysql из командной строки я продолжал получать это сообщение:

ОШИБКА 2002 (HY000): не удается подключиться к локальному серверу MySQL через сокет '/tmp/mysql.sock' (2)

Это было связано с тем, что мой локальный сервер mysql больше не работал. Чтобы перезапустить сервер, я перешел на

shell> cd /user/local/bin

где находился мой mysql.server. Отсюда просто введите:

shell> mysql.server start

Это перезапустит локальный сервер mysql.

Оттуда вы можете сбросить пароль root, если это необходимо.

mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass')
->                   WHERE User='root';
mysql> FLUSH PRIVILEGES;

2

Мне пришлось убить все экземпляры mysql, сначала найдя все идентификаторы процессов:

ps aux | grep mysql

А потом убиваем их:

kill -9 {pid}

Затем:

запуск mysql.server

Работал у меня.


1

Сокет находится в / tmp. В системе Unix из-за режимов и прав собственности на / tmp это могло вызвать некоторые проблемы. Но до тех пор, пока вы говорите нам, что МОЖЕТЕ использовать соединение mysql в обычном режиме, я думаю, это не проблема для вашей системы. Основная проверка должна заключаться в перемещении mysql.sock в более нейтральный каталог.

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

  • Ваш / tmp расположен на стандартном диске или на экзотическом монтировании (например, в ОЗУ)?

  • Ваш / tmp пуст?

  • iotopПоказывает ли вам что-то не так, когда вы сталкиваетесь с проблемой?


0

Настройте подключение к БД в диалоговом окне «Управление подключениями к БД». В качестве метода подключения выберите «Стандартный (TCP / IP)».

См. Эту страницу для получения дополнительной информации http://dev.mysql.com/doc/workbench/en/wb-manage-db-connections.html

Согласно этой другой странице, файл сокета используется, даже если вы указываете localhost.

Файл сокета Unix используется, если вы не указываете имя хоста или если вы указываете специальное имя хоста localhost.

Он также показывает, как проверить ваш сервер, выполнив следующие команды:

Если процесс mysqld запущен, вы можете проверить его, выполнив следующие команды. Номер порта или имя файла сокета Unix могут отличаться в вашей настройке. host_ip представляет IP-адрес машины, на которой работает сервер.

shell> mysqladmin version 
shell> mysqladmin variables 
shell> mysqladmin -h `hostname` version variables 
shell> mysqladmin -h `hostname` --port=3306 version 
shell> mysqladmin -h host_ip version 
shell> mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version

0

в ubuntu14.04 вы можете сделать это, чтобы решить эту проблему.

zack@zack:~/pycodes/python-scraping/chapter5$ **mysqladmin -p variables|grep socket**
Enter password: 
| socket                                            | ***/var/run/mysqld/mysqld.sock***                                                                                            |
zack@zack:~/pycodes/python-scraping/chapter5$***ln -s  /var/run/mysqld/mysqld.sock /tmp/mysql.sock***
zack@zack:~/pycodes/python-scraping/chapter5$ ll /tmp/mysql.sock 
lrwxrwxrwx 1 zack zack 27 11 29 13:08 /tmp/mysql.sock -> /var/run/mysqld/mysqld.sock=

0

Я уверен, что mysqld запущен, и mysql из командной строки может работать правильно. Но сервер httpd показывает проблему (не удается подключиться к mysql через сокет).

Я запустил службу с mysqld_safe &.

наконец, я обнаружил, что когда я запускаю службу mysqld с помощью службы mysqld start, возникают проблемы (проблема с разрешением selinux), и когда я исправляю проблему с selinux и запускаю mysqld с помощью «service mysqld start», проблема подключения httpd исчезает. Но когда я запускаю mysqld с mysqld_safe &, mysqld может работать. (клиент mysql может работать правильно). Но при подключении к httpd все еще есть проблема.


0

Если это связано с сокетом, прочтите этот файл

/etc/mysql/my.cnf

и посмотрите, какое стандартное расположение гнезда. Это такая строка:

socket = /var/run/mysqld/mysqld.sock

теперь создайте псевдоним для вашей оболочки, например:

alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock"

Таким образом, вам не нужны привилегии root.


0

Просто попробуйте бежать mysqld.

Это было то, что у меня не работало на Mac. Если это не сработает, попробуйте перейти на страницу, /usr/local/var/mysql/<your_name>.errчтобы просмотреть подробные журналы ошибок.


0
# shell script ,ignore the first 
$ $(dirname `which mysql`)\/mysql.server start

Может быть полезно.


То же, что и самый звездный ответ `` sudo /usr/local/mysql/support-files/mysql.server start '', но разные ОС могут иметь другой путь к `` mysql.server ''. Поэтому я попытался написать одну командную строку, которая могла бы быть полезным во многих ОС.
陈 也在 哦

0

Использование MacOS Mojave 10.14.6 для MySQL 8.0.19, установленного через Homebrew

  • Ран sudo find / -name my.cnf
  • Файл найден в /usr/local/etc/my.cnf

Некоторое время работал, затем в конце концов ошибка вернулась. Удалил версию MySQL для Homebrew и установил файл .dmg прямо отсюда

С тех пор мы счастливы на связи.


0

В моем случае помогло отредактировать файл /etc/mysql/mysql.conf.d/mysqld.cnfи заменить строку:

socket      = /var/run/mysqld/mysqld.sock

с участием

socket      = /tmp/mysql.sock

Затем я перезапустил сервер, и он работал нормально. Самое смешное, что если я верну линию, как было раньше, и перезапущу, она все равно будет работать ..


0

Недавно я столкнулся с подобной проблемой. Перебрал много ответов. Я получил его, выполнив следующие шаги.

  1. измените путь к сокету в /etc/my.cnf (так как я неоднократно получал ошибку с /tmp/mysql.sock) ссылку, чтобы изменить путь к сокету
  2. запустите mysqld_safe, чтобы перезапустить сервер, поскольку это рекомендуемый способ перезапуска в случае ошибок. ссылка на mysqld_safe

0

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

mysql.server start

затем

mysql_secure_installation

чтобы защитить сервер, и теперь я могу посетить сервер MySQL через

sudo mysql -uroot -p

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