Когда я попытался подключиться к локальному серверу 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)
sudo /usr/local/mysql/support-files/mysql.server start
Это сработало для меня. Однако, если это не работает, убедитесь, что mysqld запущен и попробуйте подключиться.
Соответствующий раздел руководства 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.
Сначала запустите сервер, а затем выполните mysql
.
$ mysql.server start
$ mysql -h localhost -u root -p
Я видел, как это происходило в моем магазине, когда у моих разработчиков есть менеджер стека, такой как 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, установленных на компьютере, на котором вы можете подключиться к неправильному.
Я только что изменил 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': '',
},
settings.py
проекта.
Когда, если вы потеряете свой демон 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
Попытка нескольких из этих решений и отсутствие успеха, это то, что сработало для меня:
Запустите ниже cmd в терминале
/USR/локальные/MySQL/бен/mysqld_safe
Затем перезагрузите компьютер, чтобы он вступил в силу. Это работает!
Проверить количество открытых файлов для процесса mysql с помощью команды lsof.
Увеличьте предел открытых файлов и снова запустите.
ulimit
чтобы увеличить количество открытых файлов, которые разрешено открывать вашему клиенту и серверу. Если вы используете последнюю версию Ubuntu, для этого может потребоваться отредактировать сценарий запуска mysql в / etc / init, но, надеюсь, вы можете просто сделать это в файле .cnf.
Это может быть одна из следующих проблем.
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
Я думаю, что первый вариант разрешит вашу проблему.
Я думаю, что видел подобное поведение некоторое время назад, но не могу вспомнить подробности.
В нашем случае проблема заключалась в том, что testrunner инициализирует соединения с базой данных относительно первого взаимодействия с базой данных, например, путем импорта модуля в settings.py или в некоторых __init__.py.
Я попытаюсь найти дополнительную информацию, но это может уже вызвать звонок для вашего дела.
Была эта же проблема. Оказалось, что mysqld
остановился (я на Mac OSX). Я перезапустил его, и ошибка исчезла.
Я понял, что mysqld
не работает в основном из-за этой ссылки:
http://dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html
Обратите внимание на первый отзыв!
У меня есть две подлые гипотезы на этом
Посмотрите возможность невозможности доступа к файлу /tmp/mysql.sock
. Когда я устанавливаю базы данных MySQL, я обычно разрешаю сайт файла сокета в /var/lib/mysql
. Если вы входите в mysql как root@localhost
, ваш сеанс ОС должен получить доступ к папке /tmp
. Убедитесь, что /tmp
имеет правильные права доступа в ОС. Кроме того, убедитесь, что пользователь sudo всегда может читать файл в /tmp
.
Доступ к 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();
Что это дает вам?
Если эти функции возвращаются с одинаковыми значениями, вы подключаетесь и проверяете подлинность, как ожидалось. Если значения различны, вам может потребоваться создать соответствующего пользователя [email protected]
.
Убедитесь, что ваш mysql не достиг максимального количества подключений или не находится в каком-то виде цикла загрузки, как это происходит довольно часто, если настройки неверны в my.cnf.
Используйте ps aux | grep mysql, чтобы проверить, изменяется ли PID.
Убедитесь, что ваш /etc/hosts имеет 127.0.0.1 localhost
в нем, и он должен работать нормально
Мне пришлось убить все экземпляры mysql, сначала найдя все идентификаторы процесса:
ps aux | grep mysql
И затем убивая их:
kill -9 {pid}
Тогда:
mysql.server start
Работал для меня.
Посмотрел онлайн слишком долго, чтобы не вносить свой вклад. После попытки ввода командной строки 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;
Сокет находится в /tmp. В системе Unix из-за режимов и владельцев в /tmp это может вызвать некоторые проблемы. Но, пока вы говорите нам, что вы МОЖЕТЕ использовать свою связь mysql нормально, я думаю, это не проблема в вашей системе. Первичная проверка должна состоять в том, чтобы переместить mysql.sock в более нейтральный каталог.
Тот факт, что проблема возникает "случайно" (или не каждый раз), позволяет мне думать, что это может быть проблема с сервером.
Является ли ваш /tmp размещенным на стандартном диске или на экзотическом монтировании (например, в ОЗУ)?
Является ли ваш /tmp пустым?
Знает ли iotop
что-то не так, когда вы сталкиваетесь с проблемой?
Для тех, кто обновился с 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) работать снова.
ERROR! The server quit without updating PID file
снова.
если вы получите ошибку, как показано ниже:
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' : ''
}
}
Просто попробуйте запустить mysqld
.
Это то, что не работало для меня на Mac.
Если он не работает, перейдите в /usr/local/var/mysql/<your_name>.err
, чтобы просмотреть подробные журналы ошибок.
Если этот сокет связан с этим файлом
/etc/mysql/my.cnf
и посмотрите, что такое стандартное расположение сокетов. Это строка вроде:
socket = /var/run/mysqld/mysqld.sock
теперь создайте псевдоним для вашей оболочки, например:
alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock"
Таким образом, вам не нужны привилегии root.
Для меня, я уверен, что mysqld запущен, а командная строка mysql может работать исправно. Но сервер httpd показывает проблему (не может подключиться к mysql через сокет).
Наконец, я обнаружил, что при запуске службы mysqld с запуском службы mysqld возникают проблемы (проблема разрешения selinux), и когда я исправляю проблему selinux и запускаю mysqld с помощью "service mysqld start", проблема подключения httpd исчезают. Но когда я запускаю mysqld с mysqld_safe &, mysqld может работать. (клиент mysql может работать правильно). Но есть еще проблема при подключении с httpd.
в 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=
Настройте свое соединение с БД в диалоговом окне "Управление соединениями с БД". Выберите "Стандартный (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