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

Когда я попытался подключиться к локальному серверу 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)

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Я просто изменил 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': '',
},
...

Ответ 6

Когда, если вы потеряете свой демон 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

Ответ 7

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

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

enter image description here

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

Ответ 8

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

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

Ответ 9

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

  • Неправильная блокировка 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

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

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

CONJECTURE # 1

Посмотрите возможность невозможности доступа к файлу /tmp/mysql.sock. Когда я устанавливаю базы данных MySQL, я обычно разрешаю сайт файла сокета в /var/lib/mysql. Если вы входите в mysql как [email protected], ваш сеанс ОС должен получить доступ к папке /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

Это приведет к обходу входа в систему как [email protected], но убедитесь, что у вас есть [email protected]'127.0.0.1'.

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

SELECT USER(),CURRENT_USER();

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

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

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

Ответ 13

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

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

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

Ответ 14

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

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

Ответ 15

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

Ответ 16

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

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

Ответ 17

Посмотрел онлайн слишком долго, чтобы не вносить свой вклад. После попытки ввода командной строки 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;

Ответ 18

Для тех, кто обновился с 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) работать снова.

Ответ 19

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

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

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

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

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

Ответ 20

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

ps aux | grep mysql

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

kill -9 {pid}

Тогда:

mysql.server start

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

Ответ 21

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

Ответ 22

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

[email protected]:~/pycodes/python-scraping/chapter5$ **mysqladmin -p variables|grep socket**
Enter password: 
| socket                                            | ***/var/run/mysqld/mysqld.sock***                                                                                            |
[email protected]:~/pycodes/python-scraping/chapter5$***ln -s  /var/run/mysqld/mysqld.sock /tmp/mysql.sock***
[email protected]:~/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=

Ответ 23

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

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

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

Ответ 24

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

/etc/mysql/my.cnf

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

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

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

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

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

Ответ 25

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

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

Ответ 26

Возможно, демон (mysqld) и клиент используют разные местоположения сокетов (то есть mysqld создает файл сокета в каком-то месте, а mysql ищет его в другом месте)

  1. Убедитесь, что mysqld запущен, и проверьте, где он создал файл сокета, либо в /etc/my.cnf, либо всякий раз, когда вы запускаете его, и он сообщает вам (... mysqld: готов к соединениям. Версия: '8.0.15' socket: '/var/lib/mysql/mysql.sock'...)

  2. Когда вы запустите команду mysql, запустите ее как пользователь mysql -u (root, если впервые) -p -S/var/lib/mysql/mysql.sock( или местоположение, которое вы видели в шаге 1)

Если вы инициализировали mysqld вручную с помощью --initialize, то он покажет вам временный пароль, и вы должны использовать его для входа в систему.