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

91

Когда я попытался подключиться к локальному серверу 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 подтвердите, что гнездо существует. Кроме того, если я открою debugger в except в этом исключении, я могу надежно подключиться с теми же параметрами.

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

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

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

DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)
  • 0
    Может быть, это ошибка в конкретной привязке, которую вы используете?
  • 0
    Что происходит, когда вы перезапускаете его?
Показать ещё 15 комментариев
Теги:

25 ответов

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

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

  • 3
    Я потратил 2 часа на это, и это решение, удивительно. Я не могу отблагодарить достаточно!
  • 1
    Я провел 3 ... СПАСИБО !!
Показать ещё 5 комментариев
69

Соответствующий раздел руководства 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, как именно вы создаете соединение и т.д.

  • 0
    Хотя в целом следование установленным диагностическим процедурам является хорошей идеей, если вы прочитаете вопрос (и процедуры), вы увидите, что процедуры были соблюдены и определили, что это не проблема с сервером MySQL. Это как-то конкретно связано с клиентом Python, так как любой другой доступ через сокет работает нормально, включая другой доступ из Python.
  • 0
    Какой странный голос против. Я опубликовал установленную процедуру по нескольким причинам: (1) другие люди публиковали только часть установленной процедуры, и лучше быть систематическим в отношении отладки, (2) казалось, что существует некоторая путаница с localhost vs 127.0.0.1, и (3 ) другие люди с таким же симптомом «Не удается подключиться к локальному серверу MySQL» могут наткнуться на этот вопрос. Я знаю, что это, скорее всего, клиент Python, поэтому я попросил дополнительную информацию, например, о том, как создается экземпляр соединения.
Показать ещё 5 комментариев
58

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

$ mysql.server start
$ mysql -h localhost -u root -p
  • 1
    это сработало !!!!!
  • 3
    не уверен, почему это не лучший ответ. Спасибо!
Показать ещё 3 комментария
22

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

на вашем терминале

mysql_config --socket

который даст вам свой путь к файлу носка. возьмите этот путь и используйте его в параметре 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, установленных на компьютере, на котором вы можете подключиться к неправильному.

  • 0
    Что делать, если ваш файл носка отсутствует?
  • 0
    купить другую пару? j / k это означает, что служба mysql не работает. запустить / перезапустить свой MySQL
Показать ещё 3 комментария
9

Я только что изменил HOST от localhost до 127.0.0.1, и он отлично работает:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '',
},
  • 2
    Было бы неплохо узнать, какой файл вы изменили и где он находится
  • 1
    В settings.py проекта.
9

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

1)

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

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

mysql -u username -p -h host databasename

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

  • 0
    Я рассмотрел практически все решения в Интернете, кроме этого, и оно сработало.
7

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

  • Система перезагрузки
  • mysql.server start
  • Успех!
7

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

/USR/локальные/MySQL/бен/mysqld_safe

Изображение 930

Затем перезагрузите компьютер, чтобы он вступил в силу. Это работает!

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

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

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

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

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

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

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

а затем введите его в код подключения db:

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

Я думаю, что первый вариант разрешит вашу проблему.

4

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

3

Была эта же проблема. Оказалось, что mysqld остановился (я на Mac OSX). Я перезапустил его, и ошибка исчезла.

Я понял, что mysqld не работает в основном из-за этой ссылки: http://dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html

Обратите внимание на первый отзыв!

3

У меня есть две подлые гипотезы на этом

CONJECTURE # 1

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

CONJECTURE # 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

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

2

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

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

2

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

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

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

ps aux | grep mysql

И затем убивая их:

kill -9 {pid}

Тогда:

mysql.server start

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

1

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

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

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

shell> cd /user/local/bin

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

shell> mysql.server start

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

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

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

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

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

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

  • Является ли ваш /tmp пустым?

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

0

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

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

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

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

Если вы находитесь на одной лодке, сначала установите [email protected] через homebrew, остановите сервер и снова запустите систему 8.0.

brew install [email protected]

/usr/local/opt/[email protected]/bin/mysql.server start
/usr/local/opt/[email protected]/bin/mysql.server stop

Затем,

mysql.server start

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

  • 0
    Большое спасибо ... Я был немного разочарован, увидев, что все мои базы данных удалены.
  • 0
    Я получаю ту же ERROR! The server quit without updating PID file снова.
Показать ещё 1 комментарий
0

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

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' : ''
    }
}
0

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

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

0

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

/etc/mysql/my.cnf

и посмотрите, что такое стандартное расположение сокетов. Это строка вроде:

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

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

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

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

0

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

Я начал службу с mysqld_safe &.

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

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

Настройте свое соединение с БД в диалоговом окне "Управление соединениями с БД". Выберите "Стандартный (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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню