无法通过 socket’/tmp/MySQL.sock 连接到本地 MySQL 服务器

当我试图在测试套件期间连接到本地 MySQL 服务器时,它 错误:

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

但是,我能够在任何时候,连接到 MySQL 通过运行命令行 mysql程序。 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)
404438 次浏览

我想我前段时间看到过同样的行为,但记不清细节了。
在我们的例子中,问题在于 testrunner 初始化数据库连接相对于所需的第一个数据库交互的时刻,例如,通过在 setings.py 或一些 init & # 95; & # 95; 中导入一个模块。Py. 我会试着挖掘更多信息但这可能已经让你想起了你的案子。

确保/etc/hosts 中包含 127.0.0.1 localhost,它应该可以正常工作

使用 lsofcommand 检查 mysql 进程打开的文件数。

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

MySQL 手册的相关部分是 给你

另外,请记住本地主机和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 没有达到最大连接,或者没有进入某种引导循环,如果 my.cnf 中的设置不正确,这种情况经常发生。

使用 ps aux | grep mysql 检查 PID 是否正在更改。

这可能是下列问题之一。

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

Mysqladmin-p 变量 | grep 套接字

然后输入你的数据库连接代码:

pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock")

/tmp/mysql.sock 是从 grep 返回的

错误的 mysql 端口 解决方案: 您必须找到正确的 mysql 端口:

mysqladmin -p variables | grep port

然后在你的代码中:

pymysql.connect(db='db', user='user', passwd='pwd', host='localhost', port=3306)

3306是从 grep 返回的端口

我想第一个选择会解决你的问题。

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

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

  • 您的/tmp 是位于标准磁盘上,还是位于特殊的挂载(如 RAM 中)上?

  • 你的/tmp 是空的吗?

  • 当你遇到这个问题的时候,iotop会告诉你一些错误吗?

当我的开发人员安装了一个像 MAMP 这样的堆栈管理器,并且在非标准位置预先配置了 MySQL 时,我就看到了这种情况发生。

在你的终点站

mysql_config --socket

这样你就能找到袜子文件了。获取该路径并在 DATABASES 主机参数中使用它。

你要做的就是

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,因为可能连接到了错误的实例。

我对此有两个鬼鬼祟祟的猜测

猜想1

调查无法访问 /tmp/mysql.sock文件的可能性。当我设置 MySQL 数据库时,我通常让套接字文件站点位于 /var/lib/mysql中。如果您以 root@localhost的身份登录 mysql,那么您的操作系统会话需要访问 /tmp文件夹。确保 /tmp在操作系统中具有正确的访问权限。另外,确保 sudo 用户始终可以读取 /tmp中的文件。

猜想2

通过 127.0.0.1访问 mysql 可能会导致一些混乱,如果你没有注意的话?

如果使用 127.0.0.1连接到 MySQL,可能需要从命令行指定 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

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

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

根据 另一页,即使指定了 localhost,也会使用套接字文件。

如果您没有指定主机名,或者如果您没有指定主机名,则使用 Unix 套接字文件 指定特殊的主机名 localhost。

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

如果一个 mysqld 进程正在运行,您可以通过尝试 端口号或 Unix 套接字文件名可能是 在 setup.host _ 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

如果您在 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 工作

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

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

在网上找了太久没有贡献。在尝试从命令行输入 mysql 提示符之后,我继续收到以下消息:

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

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

shell> cd /user/local/bin

我的 mysql.server 所在的位置:

shell> mysql.server start

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

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

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

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

我发现 mysqld之所以无法运行,很大程度上是因为这个链接: Http://dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html

注意第一个提示!

在终端运行下面的 cmd

/usr/local/mysql/bin/mysqld _ safe

enter image description here

然后重新启动机器生效。它工作了! !

对我来说,问题是我没有运行 MySQLServer。 先运行服务器,然后执行 mysql

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

在尝试了以下几种解决方案并且没有取得任何成功之后,下面的方法对我很有效:

  1. 重启系统
  2. 服务器启动
  3. 成功了!

在 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=

我必须首先找到所有的进程 ID,从而杀死 mysql 的所有实例:

Ps aux | grep mysql

然后杀死他们:

Kill -9{ pid }

然后:

服务器启动

对我有用。

我刚刚把 HOSTlocalhost改成了 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': '',
},
...

对于我来说,我确信 mysqld 已经启动,命令行 mysql 可以正常工作。但是 httpd 服务器显示了这个问题(不能通过套接字连接 mysql)。

我用 mysqld _ safe & 启动了这个服务。

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

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

/etc/mysql/my.cnf

看看标准的插座位置是什么,像这样的线:

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

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

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

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

只需尝试运行 mysqld

这就是 Mac 上不适合我的地方。 如果不起作用,尝试转到 /usr/local/var/mysql/<your_name>.err查看详细的错误日志。

如果出现如下错误:

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

对于那些通过自制软件从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)再次工作。

# shell script ,ignore the first
$ $(dirname `which mysql`)\/mysql.server start

也许会有帮助。

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

  • 查了 sudo find / -name my.cnf
  • /usr/local/etc/my.cnf找到的文件

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

从那以后,我们很开心。

在我的例子中,有帮助的是编辑文件 /etc/mysql/mysql.conf.d/mysqld.cnf并替换下面的行:

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

socket      = /tmp/mysql.sock

然后我重新启动了服务器,它运行良好。有趣的是,如果我把生产线恢复到原来的样子,重新开始生产,生产线仍然可以工作。.

我最近也遇到过类似的问题。我想了很多答案。我按照下面的步骤解决了。

  1. 更改/etc/my.cnf 中的套接字路径(因为我在/tmp/mysql.sock 中反复出现错误) 引用以更改套接字路径
  2. 运行 mysqld _ safe 以重新启动服务器,因为这是在出现错误时推荐的重新启动方式

对我来说,mysql 服务器没有运行

mysql.server start

那么

mysql_secure_installation

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

mysql -u root -p

或者

sudo mysql -u root -p

取决于你的安装。

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

brew services start mysql

以下步骤将有所帮助:

  1. 服务器启动
  2. 列表项目

详情请参阅 去中号裁判那里

我用的是蒙特雷操作系统,我把/opt/homebrew/etc/my.cnf 中的文件内容从“ bind-address = 127.0.0.1”改成了“ bind-address = localhost”

Mac 用户在这里运行 Mac os mojave 10.14。在我的例子中,帮助我的是从系统首选项窗格中卸载 MySQL,然后在安装向导期间重新安装并选择遗留密码 MySQL 系统。

我通过进入苹果菜单 > 系统首选项 > > MySQL > > 然后点击卸载来完成这个操作。

卸载成功后,我回到 MySQL 的网站,进入归档下载,并在 x86 _ 64(MySQL Community Server-GPL)上为 macos10.14下载了 MySQL Ver 8.0.18。

现在,当你浏览安装向导的时候,安装程序会要求你选择你想要使用的密码类型,在这里你必须选择允许你使用 root 用户和密码登录 MySQL 的遗留系统。

完成安装向导后,我重新启动了我的终端(在我的例子中,我使用的是 vs 代码的终端) ,然后运行“ MySQL-u root-p”,并能够输入我在安装过程中创建的密码,进入 MySQL 没有错误。

你可以试试 $mysql.server 开始 那么 $mysql-h localhost-u root-p 在密码中,只需按回车键,它就会启动, 然后你就可以改密码了

这对我很有效:

mysql.server start
mysql -u root -p