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

时间:2013-05-01 20:06:18

标签: python mysql django

当我尝试在测试套件中连接到本地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)

32 个答案:

答案 0 :(得分:142)

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

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

答案 1 :(得分:70)

MySQL手册的相关部分是here。我首先要完成那里列出的调试步骤。

另外,请记住localhost和127.0.0.1在此上下文中不是同一个东西:

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

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

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

答案 2 :(得分:66)

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

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

答案 3 :(得分:21)

我已经看到这种情况发生在我的商店,当我的开发人员安装了像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,您可能连接到错误的服务器。

答案 4 :(得分:13)

我刚刚将HOSTlocalhost更改为127.0.0.1,效果很好:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '',
},

答案 5 :(得分:11)

当你在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

答案 6 :(得分:8)

在终端

中运行以下cmd
  

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

enter image description here

然后重启机器才能生效。它有效!!

答案 7 :(得分:7)

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

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

答案 8 :(得分:7)

这可能是以下问题之一。

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

    mysqladmin -p变量| grep socket

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

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

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

答案 9 :(得分:7)

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

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

答案 10 :(得分:4)

我想我前段时间看过同样的行为,但不记得细节了 在我们的例子中,问题是testrunner相对于所需的第一个数据库交互初始化数据库连接的时刻,例如,通过在settings.py或某些__init__.py中导入模块。 我会尝试挖掘更多信息,但这可能已经为你的情况敲响了警钟。

答案 11 :(得分:3)

如果收到如下错误:

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

答案 12 :(得分:3)

我对这一个有两个偷偷摸摸的推测

CONJECTURE#1

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

CONJECTURE#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

答案 13 :(得分:3)

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

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

注意第一个提示!

答案 14 :(得分:2)

确保您的/ etc / hosts中包含127.0.0.1 localhost并且它应该可以正常运行

答案 15 :(得分:2)

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

答案 16 :(得分:2)

在网上看了太长时间没有贡献。在尝试从命令行输入mysql提示符后,我继续收到此消息:

ERROR 2002(HY000):无法通过socket'/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;

答案 17 :(得分:2)

检查你的mysql是否未达到最大连接数,或者如果my.cnf中的设置不正确,检查是否经常出现某种启动循环。

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

答案 18 :(得分:1)

我不得不首先找到所有进程ID来杀掉所有mysql实例:

  

ps aux | grep mysql

然后杀死他们:

  

kill -9 {pid}

然后:

  

mysql.server start

为我工作。

答案 19 :(得分:1)

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

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

  • 您的/ tmp是位于标准磁盘上还是位于异国情况下(如RAM中)?

  • 你的/ tmp是空的吗?

  • 遇到问题后,iotop会出现问题吗?

答案 20 :(得分:0)

在ubuntu14.04中你可以解决这个问题。

$("#time-remaining").text((seconds -= 1)  + " seconds");

答案 21 :(得分:0)

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

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

根据this other page,即使您指定了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

答案 22 :(得分:0)

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

我使用mysqld_safe&。

启动了服务

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

连接时仍然存在问题

答案 23 :(得分:0)

如果它的套接字相关读取此文件

/etc/mysql/my.cnf

并查看标准套接字位置是什么。这是一个类似的行:

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

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

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

这样您就不需要root权限。

答案 24 :(得分:0)

只需尝试运行mysqld即可。

这是我在mac上没有用的东西。 如果不起作用,请转到/usr/local/var/mysql/<your_name>.err查看详细的错误日志。

答案 25 :(得分:0)

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

可能会有所帮助。

答案 26 :(得分:0)

使用通过Homebrew安装的适用于MySQL 8.0.19的MacOS Mojave 10.14.6

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

工作了一段时间,然后最终返回了错误。卸载MySQL的Homebrew版本,并直接从here

安装.dmg文件。

从那时起一直很快乐。

答案 27 :(得分:0)

就我而言,帮助编辑文件/etc/mysql/mysql.conf.d/mysqld.cnf并替换行:

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

使用

socket      = /tmp/mysql.sock

然后我重新启动了服务器,它运行正常。有趣的是,如果我将线路恢复原状并重新启动,它仍然可以正常工作。

答案 28 :(得分:0)

我最近也遇到过类似的问题。经历了许多答案。我按照以下步骤操作。

  1. 更改/etc/my.cnf中的套接字路径(因为我反复遇到/tmp/mysql.sock错误)reference to change the socket path
  2. 运行mysqld_safe以重新启动服务器,因为这是在出现错误时重新启动的推荐方法。 reference to mysqld_safe

答案 29 :(得分:0)

对我来说,mysql服务器未运行。因此,我通过以下方式启动了mysql服务器

mysql.server start

然后

mysql_secure_installation

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

的MySQL服务器

sudo mysql -uroot -p

答案 30 :(得分:0)

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

brew services start mysql

答案 31 :(得分:0)

以下步骤将有所帮助:

  1. mysql.server启动
  2. 列表项

了解更多详情,go to ref on medium