Неможливо підключитися до локального сервера MySQL через socket '/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?
dgel

2
робить mysql -h 127.0.0.1роботу з командного рядка? Я не дуже впевнений, що ваш сервер mysql насправді слухає на порту TCP.
Елі

1
Ви впевнені, що у вас є правильні версії клієнтських бібліотек Python MySQL для вашої версії MySQL? Також mysql -h localhostнадійно працює?
Старий Про

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" ..... Але дякую, приємний пост!
Л. Клоц

2
sudo: /usr/local/mysql/support-files/mysql.server: команда не знайдена. чому?
Сям Піллай

1
Чому двокрапка після судо? Перевірте, чи існує шлях
Пратяй

Або якщо встановлено mysql з домашньою мовою: sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start
Majoren

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.
Старий Про

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

4
+1 Я отримував цю помилку, намагаючись підключитися до mysql через тунель ssh (використовуючи localhostяк хост). Зміна, щоб 127.0.0.1виправити це.
крок

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

Дякую! для мене це виправлення під час спроби підключитися до контейнера maridb docker.
Люциан Oprea

86

Для мене проблема полягала в тому, що я не працював на сервері mysql. Спершу запустіть сервер, а потім виконайте mysql.

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

28

Я бачив, як це трапляється в моєму магазині, коли в моїх розробниках встановлений диспетчер стеків, як MAMP, який попередньо налаштований з MySQL, встановленим у нестандартному місці.

на терміналі

mysql_config --socket

це дасть вам шлях до файлу шкарпетки. пройдіться цим шляхом і використовуйте його у своєму параметрі ДІЙНОГО ДАНИХ.

Що вам потрібно зробити, це вказати на своє

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
Francis Yaconiello

6
У моєму випадку зміна HOST з "localhost" на "127.0.0.1" вирішило проблему.
lucaswxp

@lucaswxp: У моєму випадку я повинен змінити localhost з доменним іменем
Anshul Mishra

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проекті.
Сірбіто 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 / local / mysql / bin / mysqld_safe

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

Потім перезавантажте машину, щоб набути чинності. Це працює!!


1
Це працювало для мене на iMac під керуванням High Sierra, який був модернізований до Mojave. Що, мабуть, сталося, щоб файл mysql.sock був у форматі tmp та видалений під час оновлення. Оскільки сокет створюється автоматично при запуску MySQL, потрібно просто переконатися, що MySQL вимкнено, а потім запустити його в безпечному режимі, як зазначено вище. Файл mysql.sock магічно з'являється.
Девід

8

Перевірте кількість відкритих файлів для процесу mysql за допомогою команди lsof.

Збільште ліміт відкритих файлів і запустіть знову.


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

8

Спробувавши декілька цих рішень і не маючи успіху, для мене це спрацювало:

  1. Перезавантажте систему
  2. mysql.server start
  3. Успіху!

7

Це може бути однією з наступних проблем.

  1. Неправильний замок mysql. рішення: Ви повинні знайти правильний розетку mysql,

міншкладмін -p змінні | греп розетка

а потім помістіть його у свій код з'єднання 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 - порт, повернутий з грепа

Я думаю, що перший варіант вирішить вашу проблему.


6

Для тих, хто оновив з 5,7 до 8,0 за допомогою домашнього перекладу, ця помилка, ймовірно, спричинена тим, що оновлення не буде завершеним. У моєму випадку mysql.server startя отримав таку помилку:

ПОМИЛКА! Сервер вийшов без оновлення PID-файлу

Потім я перевірив файл журналу через cat /usr/local/var/mysql/YOURS.err | tail -n 50і виявив таке:

InnoDB: Оновлення після аварії не підтримується.

Якщо ви знаходитесь на одному човні, спочатку встановіть mysql@5.7через домашню мову, зупиніть сервер, а потім знову запустіть систему 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знову отримую те саме .
дивовижний

У моєму випадку я щойно встановив mysql@5.7 та видалив останню версію. Все почалося. Жодна база даних не видалена.
Андрій Лука

4

Я думаю, що я бачив таку саму поведінку деякий час тому, але не можу згадати деталі.
У нашому випадку проблема полягала в тому моменті, коли testrunner ініціалізує підключення до бази даних відносно першої взаємодії з базою даних, наприклад, імпортом модуля в settings.py або деякого __init__.py. Я спробую викопати ще трохи інформації, але це вже може задзвонити для вашої справи.


4

Переконайтесь, що ваш / etc / hosts має 127.0.0.1 localhostв ньому, і це має справно працювати


Дивовижно (з повагою) це сортувало це для мене - перевіривши це, я виявив, що, намагаючись налаштувати webdav, Mavericks додав до мого хост-файлу кілька додаткових (повністю зібраних) рядків - у тому числі та, яка переназначила localhost.
rob_was_taken

4

У мене є дві підступні підказки на цій

КОНЕКТУРА №1

Подивіться на можливість неможливості доступу до /tmp/mysql.sockфайлу. Коли я налаштовую бази даних MySQL, я зазвичай впускаю сайт файлу сокет /var/lib/mysql. Якщо ви увійдете в mysql as 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. Тут просто введіть:

shell> mysql.server start

Це відновить локальний сервер mysql.

Звідти ви можете скинути кореневий пароль, якщо потрібно.

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

2

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

ps aux | grep mysql

А потім вбиваючи їх:

вбити -9 {pid}

Тоді:

mysql.server start

Працювали для мене.


1

Розетка знаходиться в / tmp. У системі Unix через режими та права власності на / tmp це може спричинити певні проблеми. Але, поки ви кажете нам, що МОЖЕТЕ нормально використовувати свою mysql-з'єднання, я думаю, це не проблема у вашій системі. Первинна перевірка повинна полягати в переміщенні mysql.sock у більш нейтральний каталог.

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

  • Ваш / tmp розташований на стандартному диску або на екзотичному монтажі (як, наприклад, в оперативній пам'яті)?

  • Ваш / tmp порожній?

  • Чи iotopпоказує вам щось не так, коли ви стикаєтесь з проблемою?


0

Налаштуйте з'єднання БД у діалоговому вікні "Керування підключеннями до БД. Виберіть "Стандарт (TCP / IP)" як метод з'єднання.

Детальну інформацію див. На цій сторінці http://dev.mysql.com/doc/workbench/uk/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 зі „запуском служби mysqld service“, проблема з’єднання 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"

Таким чином, вам не потрібні кореневі привілеї.


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

Працював деякий час, потім врешті помилка повернулася. Видалено Homebrew версію MySQL та встановив .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.