Не вдається підключитися до локального сервера MySQL через сокет '/var/mysql/mysql.sock' (38)


385

У мене є велика проблема, намагаючись підключитися до mysql. Коли я бігаю:

/usr/local/mysql/bin/mysql start

У мене є така помилка:

Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38)

Я маю mysql.sockпід /var/mysqlкаталогом.

У /etc/my.cnfмене є:

[client]
port=3306
socket=/var/mysql/mysql.sock

[mysqld]
port=3306
socket=/var/mysql/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M

і в /etc/php.iniмене є:

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
mysql.default_socket = /var/mysql/mysql.sock

Я перезапустив апаш за допомогою sudo /opt/local/apache2/bin/apachectl restart

Але я все ж маю помилку.

Інакше я не знаю, чи це актуально, але коли я це mysql_config --socketsотримую

--socket         [/tmp/mysql.sock]

53
Чи працює MySQL?
Девід

2
Це, безумовно, пояснює помилку в спробі підключитися до неї. Як, як згадував @Romain, чи є щось у журналах MySQL (спробуйте /var/log/mysqlчи десь там), що вказує, чому він не працює? Ви отримуєте помилку при спробі її запуску?
Девід

5
Я отримував таку ж помилку, але в моєму випадку я виявив, що mysql не запуститься, оскільки диск був на 100% повним. /var/log/mysqld.log був корисним.
yellavon

4
Причина, яку вони запитують, чи працює вона, я вважаю, це тому, що сокет робиться при запуску служби. я встановив mysql, але ніколи не запускав службу, тому файл .sock не існує. введіть, service mysqld startякщо ви щойно встановили. hth
чангокун

2
Нижче відповідь шимани sudo service mysql startврятував мене
Кірен Сіва

Відповіді:


218

Якщо ваш файл my.cnf (як правило, в папці / etc / mysql / / ) правильно налаштовано

socket=/var/lib/mysql/mysql.sock

ви можете перевірити, чи виконується mysql, виконавши таку команду:

mysqladmin -u root -p status

спробуйте змінити свій дозвіл на папку mysql. Якщо ви працюєте локально, ви можете спробувати:

sudo chmod -R 755 /var/lib/mysql/

що вирішило це для мене


11
Це допомогло мені після того, як я виконав вищезазначені кроки та перезапустив mysqldслужбу.
вихор

11
Було б найкраще, якщо ви встановите дозволи до 755, щоб тільки власник каталогу міг писати на нього.
codewaggle

2
Моя проблема була насправді лише в тому, що мій обсяг пам’яті для мого веб-додатка закінчився! Класичний!
Джеймс Т Снелл

3
У моєму openSUSE 12.3 my.cnf знаходиться в / etc /.

ми також повинні змінити дозвіл на /var/log/mysqld.log, спасибі
Allahbakash.G

94

Ви впевнені, що встановили mysql, а також сервер mysql ..

Наприклад, щоб встановити сервер mySql, я буду використовувати yum або apt для встановлення обох інструментів командного рядка mysql та сервера:

yum -y install mysql mysql-server (or apt-get install mysql mysql-server)

Увімкніть сервіс MySQL:

/sbin/chkconfig mysqld on

Запустіть сервер MySQL:

/sbin/service mysqld start

після цього встановіть кореневий пароль MySQL:

mysqladmin -u root password 'new-password' (with the quotes)

Я сподіваюся, що це допомагає.


Я використовував домашнє пиво, і це спрацьовувало як принадність:brew install mysql
JaKXz

2
Я вже встановив клієнта, мені потрібна команда, sudo apt-get install mysql-serverтоді життя було гарним
ErichBSchulz

1
Чи не вихід Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38) з клієнта? Це клієнт намагається і не може підключитися, правда? (Я думаю, що для уточнення цього питання потрібне редагування).
msouth

76

Швидке вирішення, яке працювало для мене: спробуйте використовувати локальну ip адресу (127.0.0.1) замість 'localhost' в mysql_connect (). Це "змушує" php підключатися через TCP / IP замість unix-сокета.


Це спрацювало ... але чому? Чи не вирішується MySQL localhostі 127.0.0.1все-таки виходить, перш ніж навіть намагатися підключитися?
Хайме Хаблуцель

3
ні ... при використанні localhost ви не використовуєте Інтернет-розетку. Ви використовуєте IPC Socket. en.wikipedia.org/wiki/Unix_domain_socket . 127.0.0.1 - це локальний зворотний зв'язок, що означає, що запит не вийде з вашої машини, але він використовуватиме TCP / IP, тим самим повільніше ...
Master Yogurt

Працює і для мене. Я на ubuntu 14.04, hhvm та nginx.
Майконн

1
Дякую. це працює для мене, але мені не зрозуміло з відповіді, що таке виправлення
Натан Бюсгенс

Це також необхідно, коли ви підключаєтесь до віддаленого сервера через ssh тунель
Tamm

51

Я отримав таку помилку

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)

Спробував кілька способів і, нарешті, вирішив це наступним чином

sudo gksu gedit /etc/mysql/my.cnf

модифікований

#bind-address       = 127.0.0.1

до

bind-address        = localhost

і перезапустили

sudo /etc/init.d/mysql restart

це спрацювало


У мене було подібне питання; перейшов з ethernet (192.168.220.11) до wifi (192.168.220.12), але мав прив'язувати адресу, жорстко кодовану до Ethernet IP. Зміна, щоб localhostвиправити це.
Кріс Г

30

Переконайтеся, що у вас запущено mysqld: /etc/init.d/mysql start


3
Або sudo service mysql start|restartдля Ubuntu.
Wtower

18

Щоб запобігти виникненню проблеми, потрібно виконати витончене відключення сервера з командного рядка, а не вимкнення сервера.

shutdown -h now

Це зупинить запущені послуги до вимкнення машини.

На основі Centos, додатковим методом його відновлення знову, коли ви зіткнетеся з цією проблемою, є переміщення mysql.sock:

mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.bak

service mysqld start

Перезапуск служби створює новий запис під назвою mqsql.sock


14

Я отримав цю помилку, коли встановив cron для свого файлу. Я змінив дозволи на файл на 777, але він все ще не працював для мене. Нарешті я отримав рішення. Можливо, це буде корисно для інших.

Спробуйте за допомогою цієї команди:

mysql -h 127.0.0.1 -P 3306 -u корінь -p

Пам'ятайте, що -h означає хост , -P означає порт, а -p означає пароль.


Примусове з'єднання через TCP / IP замість використання сокета неефективно (і вимагає включити підтримку localhost TCP / IP на сервері відповідно до цього попереднього відповіді ). Прийнята відповідь з 2011 року краще: Налаштуйте сервер, щоб ви могли правильно використовувати сокет.
Квентін

10
-pне означає порт , це означає пароль , ви його переплутали-P
Квентін

Здається, це більш-менш копія цієї попередньої відповіді
Квентін

Для мене це було лише питання визначення правильного господаря: mysql -h 127.0.0.1 -u root -p
kghbln

12

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

Наприклад, на Ubuntu слід перевірити /var/log/syslog. Оскільки в цей файл також може входити багато інших речей, ви, ймовірно, хочете використовувати grepдля перегляду повідомлень mysql та tailдля перегляду лише останніх. Все разом, це може виглядати так:

grep mysql /var/log/syslog | tail -50

Не слід сліпо вносити зміни у вашу конфігурацію, оскільки хтось сказав: "Це працювало для моєї системи". З’ясуйте, що насправді не так у вашій системі, і ви швидше отримаєте кращий результат.


5
+1 Для того, щоб зробити крок назад і вказати на щось, на що багато інших відповідей навіть не вважають, - що насправді бачити те, що програма може повідомити про проблему, є набагато кращим підходом, ніж сліпо кидатися та вносити зміни, які можуть не навіть застосовно ...!
SlySven

Так, це неправильне використання .cnf. Це пояснює це. Тепер я можу перестати пробувати випадкові речі та вирішити актуальну проблему. Дякую.
Synetech

11

Іншим вирішенням є редагування /etc/my.cnf та включення хоста у розділ [client]

 [client]
 #password       = your_password
 host            = 127.0.0.1
 port            = 3306
 socket          = /var/run/mysql/mysql.sock

А потім перезапуск служби mysql.

Це вирішення було протестовано у: Версії сервера: 5.5.25a-log Розподіл джерела


додати розділ [client] рекомендується, якщо вже не в my.cnf
Cris

7

У мене була така ж проблема, і це було викликано оновленням драйверів mysql під час роботи сервера mysql. Я виправив це, просто перезапустивши і mysql, і apache2:

Служба судо mysql зупинка

Служба sudo mysql start

Служба судо апаш2 серп

Служба судо


У моєму випадку mysqlне працює. Я побіг sudo service mysql startпісля запуску, sudo service mysql statusщоб переконатися, що він не працює.
Тасс

6

У моєму випадку я використовував Centos 5.5. Я виявив, що проблема полягає в тому, що послуга mysql була зупинена дещо. Тому я запустив службу mysql з команди:

 /etc/init.d/mysqld start

Отже .. дурна помилка.


6

Якщо все спрацювало нормально, і ви тільки почали бачити цю помилку, перш ніж робити щось інше, переконайтеся, що у вас немає місця на диску:

df -h

Якщо обсяг, де створюється mysql.sock , використовується на 100%, MySql не зможе його створити, і це стане причиною цієї помилки. Все, що вам потрібно зробити, - це видалити щось, що не потрібно, як-от старі файли журналів.



5
sudo service mysql start

Це повинно вам служити чудово. Можливо, ви змінили деякі команди, які впливали на конфігурації mysql.


або systemctl start mariadb.serviceу Fedora 22 або RedHat 7. Після цього можна встановити root-пароль.
Юніор Мейхе

5

Існує багато рішень цієї проблеми, але для моєї ситуації мені просто потрібно було виправити ДАТУ на машині / сервері (сервер Ubuntu 16.04 ).

i) Перевірте дату свого сервера та виправте його.

ii) Біжи sudo /etc/init.d/mysql restart

Це повинно розпочати.


4

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


як можна додати символічне посилання там, де додаток вважав, що воно повинно бути вказане там, де воно насправді було?
Гілберто Ібарра

4

Я також виявив, що це проблема з дозволом. Я порівнював файли MySQL з робочою установкою (обидва на Debian 6 стискати) і повинен був внести наступні зміни власності (деmydatabase є будь-яка база даних).

Власність mysql:mysql:

chown mysql:mysql /var/lib/mysql
chown mysql:mysql /var/lib/mysql/ib*
chown mysql:mysql /var/lib/mysql/mydatabase
chown mysql:mysql /var/lib/mysql/mydatabase/*
chown mysql:mysql /var/lib/mysql/mysql/* 

Власність mysql:root:

chown mysql:root /var/lib/mysql/mysql
chown mysql:root /var/run/mysqld 

Власність mysql:adm:

chown mysql:adm /var/log/mysql
chown mysql:adm /var/log/mysql.err
chown mysql:adm /var/log/mysql.log* 

4

Для мене - це був просто випадок, коли MySQL потребував тривалого завантаження. Я маю понад 100 000 таблиць в одній із моїх баз даних, і це врешті-решт почалося, але, очевидно, в цьому випадку потрібно зайняти багато часу.


3

Якщо ви використовуєте мікро-версію AWS (Amazon Web Services), то це проблема пам'яті. Коли я бігав

mysql

з терміналу сказало б

ERROR 2002 (HY000): Can't connect to local MySQL server through socket /var/run/mysqld/mysqld.sock' (111)

Тому я спробував наступне, і це просто не вдалося.

service mysqld restart

Після довгих пошуків я з'ясував, що вам потрібно створити файл свопу, щоб MySQL мав достатньо пам'яті. Перелічені інструкції: http://www.prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html .

Тоді мені вдалося перезапустити mysqld.


У мене була така сама проблема на "мікро" екземплярі сервера AWS, і я можу підтвердити, що змусити DID-файл заміни виправити "ПОМИЛКА 2002 (HY000): Не вдається підключитися до локального сервера MySQL через socket / var / run / mysqld / mysqld .sock '(111) "проблема. Дякую @ jth_92!
Конарас

3

Ви завжди можете запустити сервер mysql, вказавши розташування файлу mysql.sock, скориставшись --socketопцією типу

mysql --socket=/var/mysql/mysql.sock 

Це буде працювати, навіть якщо файл файлу сокета вказано в іншому місці у файлі my.cnf.


3

Для тих, чиє рішення не спрацювало, спробуйте:

cd /etc/mysql

перевірте, чи присутній мій.cnf

nano my.cnf

і переконайтеся, що у вас є лише одна прив’язана адреса:

bind-address = 127.0.0.1

Якщо ні, то це може бути проблемою, просто закрийте нано і збережіть файл.

і service mysql start

зауважте, що якщо у вас немає nano (його текстовий редактор), просто встановіть його apt-get install nanoта натисніть Ctrl + X для виходу, не забудьте сказати Y, щоб зберегти та використовувати той самий файл)


На жаль, це не вийшло. В основному це просто говорить про те, що тільки локальна машина може отримати доступ до mysql. Немає віддалених з'єднань.
Стефан

3

У мене була ця проблема і при спробі запустити сервер, тому багато відповідей, які просто говорять про запуск сервера, не спрацювали. Перше, що можна зробити - це виконати наступне, щоб побачити, чи є якісь помилки конфігурації:

/usr/sbin/mysqld --verbose --help 1>/dev/null

У мене була одна помилка, яка виявилася:

160816 19:24:33 [Note] /usr/sbin/mysqld (mysqld 5.5.50-0ubuntu0.14.04.1-log) starting as process 9461 ...
160816 19:24:33 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
160816 19:24:33 [Note] Plugin 'FEDERATED' is disabled.
160816 19:24:33 [ERROR] /usr/sbin/mysqld: unknown variable 'innodb-online-alter-log-max-size=4294967296'
160816 19:24:33 [ERROR] Aborting

Простий grep -HR "innodb-online-alter-log-max-size" /etc/mysql/ показав мені, який саме файл містить рядок-образ, і я видалив цей рядок із файлу.

Потім, перевіривши свій /var/log/mysql/error.logфайл, у мене було:

InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 671088640 bytes!
160816 22:46:46 [ERROR] Plugin 'InnoDB' init function returned error.
160816 22:46:46 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
160816 22:46:46 [ERROR] Unknown/unsupported storage engine: InnoDB
160816 22:46:46 [ERROR] Aborting

Виходячи з цього питання, прийняте рішення не працюватиме, оскільки я навіть не міг запустити сервер, тому я дотримувався того, що деякі коментарі сказали та видалив мої /var/lib/mysql/ib_logfile0та /var/lib/mysql/ib_logfile1файли.

Це дозволило запустити сервер, і я зміг підключити та виконати запити, проте перевіряючи мій файл журналу помилок, він швидко заповнювався кількома десятками тисяч рядків, як це:

160816 22:52:15  InnoDB: Error: page 1415 log sequence number 82039318708
InnoDB: is in the future! Current system log sequence number 81640793100.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: for more information.

На підставі пропозиції звідси , щоб виправити це, я зробив mysqldump і відновив усі бази даних (див. Посилання для кількох інших рішень).

$ mysqldump -u root -p --allow-keywords --add-drop-database --comments --hex-blob --opt --quote-names --databases db_1 db_2 db_3 db_etc > backup-all-databases.sql
$ mysql -u root -p < backup-all-databases.sql

Здається, все працює так, як очікувалося зараз.


Перевірка /var/log/mysql/error.logдопомогла в моєму випадку. Це було [ERROR] Can't init tc logшвидко виправлено за допомогою наступної відповіді: dba.stackexchange.com/a/185006/163583
Juraj.Lorinc



2

Я сьогодні зіткнувся з цим питанням. Жодна з цих відповідей не дала виправлення. Мені потрібно було виконати наступні команди (знайдені тут https://stackoverflow.com/a/20141146/633107 ), щоб мій сервіс mysql запустився:

sudo /etc/init.d/mysql stop
cd /var/lib/mysql/
ls ib_logfile*
mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak
... etc ...
/etc/init.d/mysql restart

Частково на це вказували такі помилки в /var/log/mysql/error.log:

140319 11:58:21 InnoDB: Completed initialization of buffer pool
InnoDB: Error: log file ./ib_logfile0 is of different size 0 50331648 bytes
InnoDB: than specified in the .cnf file 0 5242880 bytes!
140319 11:58:21 [ERROR] Plugin 'InnoDB' init function returned error.
140319 11:58:21 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140319 11:58:21 [ERROR] Unknown/unsupported storage engine: InnoDB
140319 11:58:21 [ERROR] Aborting

Я також бачив повну помилку диска, але тільки при виконанні команд без судо. Якщо перевірка дозволів не вдається, вона повідомляє про диск повним (навіть коли ваш розділ навіть не близький до повного).


2

CentOS 7, 64 біт. Свіжа установка.
У моєму випадку помилка була через те, що у мене не було встановлено потрібного сервера MySQL та клієнта MySQL.
Використовуючи yum, я видалив mariadbі mysql-спільноту. Я завантажив rpm's для клієнта та сервера з офіційного веб-сайту MySQL та встановив сервер і клієнт.

Встановлюючи сервер, мені показали повідомлення про те, що пароль на кореневий обліковий запис для MySQL зберігається у файлі, з яким я міг переглядати sudo cat /root/.mysql_secret.

Отож, встановивши клієнт та сервер, я перевірив, чи працює MySQL (думаю, я перезавантажився перед цим) з командою, sudo service mysql statusі отримав результат.

Запуск MySQL (2601) [ОК]

Я увійшов у MySQL за допомогою пароля з файлу .mysql_secret :
mysql -uroot -pdxM01Xfg3DXEPabpf. Зауважте, щоdxM01Xfg3DXEPabpf це пароль, зазначений у файлі .mysql_secret.

а потім введено наступну команду в запиті mysql, щоб змінити пароль root:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('somePassword');

З цього часу все працювало чудово.


1
той самий випадок на RHEL6U6 з версією сервера: 5.6.23-підприємство-комерційний-розширений.
HCD


2

Це відповідає не на ваше запитання, а на його підмножину, а саме за допомогою PythonAnywhere. Я продовжував натрапляти на це питання, шукаючи виправлення, тому додаю його тут, сподіваючись, що це допоможе іншим у моїй ситуації.


PythonAnywhere вирішив змінити імена хостів підключення до бази даних, щоб підвищити ефективність та надійність, детально описані тут :

Офіційна назва хоста слід використовувати для підключення до примірника бази даних MySQL вашого облікового запису змінилося з mysql.server до имя_пользователя .mysql.pythonanywhere-services.com . Це обходить частину нашої інфраструктури, яка почала проявляти проблеми в останні тижні, і вона повинна бути набагато ефективнішою та надійнішою, ніж старий шлях.

Отже, вам потрібно буде оновити ім'я хоста до значення, виділеного вище.


2

У мене щойно була ця проблема. після дня перевірки нарешті я отримав відповідь, що файл mysql.sock створюється при запуску MariaDB та видаляється при відключенні MariaDB. Він не буде існувати, якщо MariaDB не працює. можливо ви не встановили MariaDB. ВИ МОЖЕТЕ ДІЙСНАТИСЯ ВКАЗУВАННЯ нижче: https://www.linode.com/docs/databases/mariadb/how-to-install-mariadb-on-centos-7 НАЙКРАЩЕ


1

У мене була ця помилка сокета, і вона в основному зводилася до того, що MySQL не працює. Якщо ви запустили нову установку, переконайтесь, що ви встановили 1) системний пакет та 2) інсталятор панелі (mysql.prefPane). Інсталятор на панелі дозволить вам зайти до системних налаштувань і відкрити MySQL, а потім запустити екземпляр.

Зауважте, що під час нової інсталяції мені потрібно було скинути комп’ютер, щоб зміни вступили в силу. Після перезавантаження я запустив новий екземпляр і зміг без проблем відкрити з'єднання з localhost.

Також зауважимо, що я, мабуть, встановив попередні версії MySQL, але видалив панель, що дозволяє легко отримати екземпляр MySQL, що працює для користувачів Mac.

Хороша посилання на цей процес перевстановлення: http://www.coolestguyplanettech.com/how-to-install-php-mysql-apache-on-os-x-10-6/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.