155

当我在测试套件期间尝试连接到本地 MySQL 服务器时,它失败并出现错误:

OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")

但是,我可以随时通过运行命令行 mysql程序连接到 MySQL。Aps 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)
4

33 回答 33

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

这对我有用。但是,如果这不起作用,请确保 mysqld 正在运行并尝试连接。

于 2013-09-17T06:36:49.640 回答
130

MySQL 手册的相关部分在这里。我将首先完成那里列出的调试步骤。

另外,请记住 localhost 和 127.0.0.1 在这种情况下不是一回事:

  • 如果 host 设置为localhost,则使用套接字或管道。
  • 如果 host 设置为127.0.0.1,则客户端被迫使用 TCP/IP。

因此,例如,您可以检查您的数据库是否正在侦听 TCP 连接 vi netstat -nlp。它似乎正在侦听 TCP 连接,因为您说它mysql -h 127.0.0.1工作得很好。要检查是否可以通过套接字连接到数据库,请使用mysql -h localhost.

如果这些都没有帮助,那么您可能需要发布有关您的 MySQL 配置的更多详细信息,以及您如何实例化连接等。

于 2013-05-06T16:04:38.010 回答
119

对我来说,问题是我没有运行 MySQL 服务器。先运行服务器,再执行mysql

$ mysql.server start
$ mysql -h localhost -u root -p
于 2015-05-20T20:32:13.443 回答
29

当我的开发人员安装了像 MAMP 这样的堆栈管理器时,我已经在我的商店看到过这种情况,该堆栈管理器预配置了 MySQL,安装在非标准位置。

在你的终端运行

mysql_config --socket

这将为您提供 sock 文件的路径。采用该路径并在您的 DATABASES HOST 参数中使用它。

你需要做的就是指出你的

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'test',
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',
        'PORT': '',
    },
}

笔记

如果您以某种方式在计算机上安装了多个 mysql 服务器实例,则也可以运行which mysql_config,您可能连接到错误的实例。

于 2013-05-09T16:35:41.917 回答
26

我刚刚将HOSTfrom更改localhost127.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': '',
},
...
于 2017-03-07T15:53:20.037 回答
14

什么时候,如果你在 mac OSx 中丢失了你的守护进程 mysql,但它存在于 private/var 中的其他路径中,例如,请执行以下命令

1)

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

2) 使用以下命令重新启动与 mysql 的连接:

mysql -u username -p -h host databasename

也适用于 mariadb

于 2013-08-24T11:55:08.160 回答
9

Run the below cmd in terminal

/usr/local/mysql/bin/mysqld_safe

enter image description here

Then restart the machine to take effect. It works!!

于 2015-01-22T11:12:29.563 回答
9

对我来说,mysql 服务器没有运行。所以,我通过

mysql.server start

然后

mysql_secure_installation

保护服务器,现在我可以通过

mysql -u root -p

或者

sudo mysql -u root -p

取决于您的安装。

于 2020-06-19T01:30:58.047 回答
8

在尝试了其中一些解决方案但没有任何成功之后,这对我有用:

  1. 重启系统
  2. mysql.server 启动
  3. 成功!
于 2015-10-29T18:31:20.200 回答
8

对于通过自制程序从 5.7 升级到 8.0 的用户,此错误可能是由于升级未完成造成的。就我而言,mysql.server start给我以下错误:

错误!服务器退出但不更新 PID 文件

然后我通过查看日志文件cat /usr/local/var/mysql/YOURS.err | tail -n 50,发现以下内容:

InnoDB:不支持崩溃后升级。

如果你在同一条船上,首先mysql@5.7通过 homebrew 安装,停止服务器,然后重新启动 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) 再次工作。

于 2018-07-13T00:43:32.700 回答
7

这可能是以下问题之一。

  1. 错误的mysql锁。解决方案:你必须找出正确的mysql套接字,

mysqladmin -p 变量 | grep 套接字

然后将其放入您的数据库连接代码中:

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 返回的端口

我认为第一个选项将解决您的问题。

于 2013-05-09T15:25:50.723 回答
7

使用 lsof 命令检查 mysql 进程的打开文件数。

增加打开文件限制并再次运行。

于 2013-05-06T13:06:53.497 回答
5

I have two sneaky conjectures on this one

CONJECTURE #1

Look into the possibility of not being able to access the /tmp/mysql.sock file. When I setup MySQL databases, I normally let the socket file site in /var/lib/mysql. If you login to mysql as root@localhost, your OS session needs access to the /tmp folder. Make sure /tmp has the correct access rights in the OS. Also, make sure the sudo user can always read file in /tmp.

CONJECTURE #2

Accessing mysql via 127.0.0.1 can cause some confusion if you are not paying attention. How?

From the command line, if you connect to MySQL with 127.0.0.1, you may need to specify the TCP/IP protocol.

mysql -uroot -p -h127.0.0.1 --protocol=tcp

or try the DNS name

mysql -uroot -p -hDNSNAME

This will bypass logging in as root@localhost, but make sure you have root@'127.0.0.1' defined.

Next time you connect to MySQL, run this:

SELECT USER(),CURRENT_USER();

What does this give you?

  • USER() reports how you attempted to authenticate in MySQL
  • CURRENT_USER() reports how you were allowed to authenticate in MySQL

If these functions return with the same values, then you are connecting and authenticating as expected. If the values are different, you may need to create the corresponding user root@127.0.0.1.

于 2013-05-10T21:23:41.457 回答
4

确保您的 /etc/hosts 包含127.0.0.1 localhost在其中并且应该可以正常工作

于 2013-05-04T21:33:53.970 回答
4

我想我前段时间看到过同样的行为,但不记得细节了。
在我们的例子中,问题是测试运行程序初始化数据库连接时,需要与第一次数据库交互相关,例如,通过在 settings.py 或一些 __init__.py 中导入模块。我会尝试挖掘更多信息,但这可能已经为您的案件敲响了警钟。

于 2013-05-01T20:51:14.287 回答
4

如果您收到如下错误:

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

然后只需找到您的 mysqld.sock 文件位置并将其添加到“HOST”。

就像我在 linux 上使用 xampp 所以我的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' : ''
    }
}
于 2018-06-07T09:59:02.473 回答
3

有同样的问题。原来mysqld已经停止运行(我在 Mac OSX 上)。我重新启动它,错误消失了。

我发现这mysqld主要是因为这个链接没有运行:http: //dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html

注意第一个提示!

于 2014-06-17T20:16:53.590 回答
3

我必须通过首先找到所有进程 ID 来杀死所有 mysql 实例:

ps辅助| grep mysql

然后杀死他们:

杀死 -9 {pid}

然后:

mysql.server 启动

为我工作。

于 2017-02-07T14:41:37.220 回答
2

在网上看了太久没投稿。在尝试从命令行输入 mysql 提示符后,我继续收到此消息:

ERROR 2002 (HY000): 无法通过套接字 '/tmp/mysql.sock' 连接到本地 MySQL 服务器 (2)

这是因为我的本地 mysql 服务器不再运行。为了重新启动服务器,我导航到

shell> cd /user/local/bin

我的 mysql.server 所在的位置。从这里,只需输入:

shell> mysql.server start

这将重新启动本地 mysql 服务器。

如果需要,您可以从那里重置root密码..

mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass')
->                   WHERE User='root';
mysql> FLUSH PRIVILEGES;
于 2014-04-04T01:32:20.507 回答
2

检查您的 mysql 是否没有达到最大连接数,或者如果 my.cnf 中的设置不正确,则经常发生这种情况,它没有处于某种引导循环中。

使用ps aux | grep mysql 检查 PID 是否发生变化。

于 2013-05-06T19:14:43.647 回答
1

套接字位于 /tmp。在 Unix 系统上,由于 /tmp 上的模式和所有权,这可能会导致一些问题。但是,只要你告诉我们你可以正常使用你的mysql连接,我想这不是你系统的问题。最初的检查应该是将 mysql.sock 重新定位到更中性的目录中。

问题“随机”发生(或不是每次)的事实让我认为这可能是服务器问题。

  • 您的 /tmp 是位于标准磁盘上,还是位于异国情调的挂载上(例如在 RAM 中)?

  • 你的 /tmp 是空的吗?

  • 当您遇到问题时,是否iotop显示您有问题?

于 2013-05-09T15:35:08.393 回答
1
# shell script ,ignore the first 
$ $(dirname `which mysql`)\/mysql.server start

可能会有所帮助。

于 2019-12-09T15:07:45.833 回答
1

如果您通过 Homebrew 安装,请尝试运行

brew services start mysql
于 2020-07-12T21:03:31.523 回答
0

在“管理数据库连接”对话框中配置您的数据库连接。选择“标准 (TCP/IP)”作为连接方法。

有关更多详细信息,请参阅此页面 http://dev.mysql.com/doc/workbench/en/wb-manage-db-connections.html

根据this other page,即使您指定localhost,也会使用套接字文件。

如果未指定主机名或指定特殊主机名 localhost,则使用 Unix 套接字文件。

它还显示了如何通过运行以下命令来检查您的服务器:

如果 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
于 2013-05-11T16:47:43.373 回答
0

以下步骤将有所帮助:

  1. mysql.server 启动
  2. 项目清单

有关更多详细信息,请参阅介质上的参考

于 2020-08-08T11:28:07.883 回答
0

在我的情况下,帮助编辑文件/etc/mysql/mysql.conf.d/mysqld.cnf并替换该行:

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

socket      = /tmp/mysql.sock

然后我重新启动了服务器,它工作正常。有趣的是,如果我像以前一样放回线路并重新启动它仍然有效..

于 2020-03-23T19:04:27.610 回答
0

我最近遇到了类似的问题。经历了很多答案。我通过以下步骤使其工作。

  1. 更改 /etc/my.cnf 中的套接字路径(因为我反复遇到 /tmp/mysql.sock 错误)参考以更改套接字路径
  2. 运行 mysqld_safe 以重新启动服务器,因为这是在出现错误时重新启动的推荐方式。引用 mysqld_safe
于 2020-04-10T12:24:12.547 回答
0

对我来说,我确定mysqld启动了,命令行mysql可以正常工作。但是 httpd 服务器显示问题(无法通过套接字连接到 mysql)。

我用 mysqld_safe& 启动了服务。

最后,我发现当我用service mysqld start启动mysqld服务时,有问题(selinux权限问题),当我修复selinux问题,用“service mysqld start”启动mysqld时,httpd连接问题消失了。但是当我用 mysqld_safe& 启动 mysqld 时,mysqld 就可以工作了。(mysql客户端可以正常工作)。但是与httpd连接时仍然存在问题。

于 2017-07-31T14:06:21.130 回答
0

使用 MacOS Mojave 10.14.6 for MySQL 8.0.19 通过 Homebrew 安装

  • sudo find / -name my.cnf
  • 文件位于/usr/local/etc/my.cnf

工作了一段时间,然后最终错误返回。卸载了 MySQL 的 Homebrew 版本并直接从这里安装了 .dmg 文件

从那时起就愉快地联系起来。

于 2020-02-07T00:31:50.623 回答
0

如果它与套接字相关,请阅读此文件

/etc/mysql/my.cnf

看看标准的插座位置是什么。这是一行:

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

现在为您的 shell 创建一个别名,例如:

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

这样你就不需要root权限了。

于 2017-08-10T10:13:20.833 回答
0

只需尝试运行mysqld.

这在 mac 上对我不起作用。如果它不起作用,请尝试/usr/local/var/mysql/<your_name>.err查看详细的错误日志。

于 2017-09-02T21:10:14.813 回答
0

我正在使用 macOS Monterey,我通过将位于 /opt/homebrew/etc/my.cnf 中的文件内容从“bind-address = 127.0.0.1”更改为“bind-address = localhost”来修复它

于 2021-11-16T02:35:14.637 回答
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=
于 2015-11-29T05:10:59.607 回答