无法通过套接字'/tmp/mysql.sock连接到本地MySQL服务器

Ale*_*nor 117 python mysql django

当我在测试套件中尝试连接到本地MySQL服务器时,它失败并显示错误:

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

但是,我可以随时通过运行命令行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)
Run Code Online (Sandbox Code Playgroud)

Pra*_*yay 146

sudo /usr/local/mysql/support-files/mysql.server start 
Run Code Online (Sandbox Code Playgroud)

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

  • 服务器退出而不更新 PID 文件 (/var/lib/mysql/Saranshs-MacBook-Pro.local.pid)。 (4认同)
  • 须藤:/usr/local/mysql/support-files/mysql.server:找不到命令。为什么? (2认同)
  • 或者,如果 mysql 与自制软件一起安装: sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start (2认同)

jto*_*ron 79

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配置的更多详细信息,以及您如何实例化连接等.

  • 多么奇怪的否决票。我发布既定程序有几个原因:(1) 其他人只发布了部分既定程序,最好对调试进行系统化,(2) localhost 与 127.0.0.1 似乎有些混淆,以及 (3 ) 其他具有相同“无法连接到本地 mysql 服务器”症状的人可能会偶然发现这个问题。我知道这很可能是 Python 客户端,这就是我询问更多信息的原因,例如有关如何实例化连接的信息。 (3认同)
  • +1我试图通过ssh隧道(使用`localhost`作为主机)连接到mysql时遇到此错误.更改为"127.0.0.1"修复了它. (3认同)
  • 根据记录,这解决了我的问题:“无法通过套接字‘/tmp/mysql.sock’连接到本地 MySQL 服务器”。 (2认同)
  • 谢谢!在尝试连接到 docker maridb 容器时,这个修复对我有用。 (2认同)

yas*_*ask 78

对我来说问题是我没有运行mysql服务器.首先运行服务器然后执行mysql.

$ mysql.server start
$ mysql -h localhost -u root -p
Run Code Online (Sandbox Code Playgroud)


sh6*_*210 30

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

mysql.server start
Run Code Online (Sandbox Code Playgroud)

然后

mysql_secure_installation

确保服务器安全,现在我可以通过以下方式访问 MySQL 服务器

mysql -u root -p

或者

sudo mysql -u root -p

取决于您的安装。


Fra*_*llo 22

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

在你的终端运行

mysql_config --socket
Run Code Online (Sandbox Code Playgroud)

这将为您提供sock文件的路径.走这条路并在你的DATABASES HOST参数中使用它.

你需要做的就是指出你的想法

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'test',
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',
        'PORT': '',
    },
}
Run Code Online (Sandbox Code Playgroud)

注意

也跑which mysql_config,如果你不小心安装了您可能会被连接到错误的一个机器上的MySQL服务器的多个实例.

  • 在我的情况下,将HOST从"localhost"更改为"127.0.0.1"解决了这个问题. (4认同)

Sir*_*o X 16

我只是改变了HOSTlocalhost127.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': '',
},
...
Run Code Online (Sandbox Code Playgroud)

  • 很高兴知道你改变了什么文件以及它的位置 (3认同)

小智 11

何时,如果你在mac OSx中丢失你的守护进程mysql但是在private/var中以其他路径为例,请执行以下命令

1)

ln -s /private/var/mysql/mysql.sock /tmp/mysql.sock
Run Code Online (Sandbox Code Playgroud)

2)重启你的连接到mysql:

mysql -u username -p -h host databasename
Run Code Online (Sandbox Code Playgroud)

也适用于mariadb


Pra*_*ams 8

在终端中运行以下cmd

在/ usr /本地/ MySQL的/斌/ mysqld_safe的

在此输入图像描述

然后重启机器才能生效.有用!!


Bla*_*ard 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
Run Code Online (Sandbox Code Playgroud)

然后,

mysql.server start
Run Code Online (Sandbox Code Playgroud)

这将使您的 MySQL (8.0) 再次工作。


小智 7

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

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


Cha*_*nda 7

这可能是以下问题之一.

  1. mysql锁不正确.解决方案:您必须找到正确的mysql套接字,

mysqladmin -p变量| grep socket

然后将它放在您的数据库连接代码中:

pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock")
Run Code Online (Sandbox Code Playgroud)

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

2.Incorrect mysql端口解决方案:你必须找到正确的mysql端口:

mysqladmin -p variables | grep port
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中:

pymysql.connect(db='db', user='user', passwd='pwd', host='localhost', port=3306)
Run Code Online (Sandbox Code Playgroud)

3306是从grep返回的端口

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


小智 7

在尝试了一些这些解决方案并且没有取得任何成功后,这对我有用:

  1. 重启系统
  2. mysql.server启动
  3. 成功!


Rol*_*DBA 5

我对此有两个偷偷摸摸的猜想

猜想#1

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

猜想#2

127.0.0.1如果您不注意的话,通过访问 mysql可能会引起一些混乱。如何?

从命令行,如果使用连接到 MySQL 127.0.0.1,则可能需要指定 TCP/IP 协议。

mysql -uroot -p -h127.0.0.1 --protocol=tcp
Run Code Online (Sandbox Code Playgroud)

或尝试 DNS 名称

mysql -uroot -p -hDNSNAME
Run Code Online (Sandbox Code Playgroud)

这将绕过登录为root@localhost,但请确保您已root@'127.0.0.1'定义。

下次连接到 MySQL 时,运行以下命令:

SELECT USER(),CURRENT_USER();
Run Code Online (Sandbox Code Playgroud)

这给你带来了什么?

  • USER()报告您如何尝试在 MySQL 中进行身份验证
  • CURRENT_USER()报告如何允许您在 MySQL 中进行身份验证

如果这些函数返回相同的值,则您正在按预期进行连接和身份验证。如果值不同,您可能需要创建相应的用户root@127.0.0.1


小智 4

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