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

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

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

但是,我可以在任何时候通过运行命令行mysql程序连接到MySQL。 ps aux | grep mysql ps aux | grep mysql显示服务器正在运行,而stat /tmp/mysql.sock确认该套接字存在。 此外,如果我在该exception的except子句中打开debugging器,则可以可靠地使用完全相同的参数进行连接。

这个问题相当可靠地重现,但它似乎不是100%,因为每一次在一个蓝色的月亮,我的testing套件确实运行没有碰到这个错误。 当我试图与sudo dtruss运行它没有重现。

所有的客户端代码都是用Python编写的,尽pipe我无法弄清楚这些代码是相关的。

切换到使用主机127.0.0.1会产生错误:

 DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61) 
 sudo /usr/local/mysql/support-files/mysql.server start 

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

MySQL手册的相关部分在这里 。 我将首先看看那里列出的debugging步骤。

另外,请记住,在这种情况下localhost和127.0.0.1不是同一个东西:

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

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

如果这些都没有帮助,那么你可能需要发布更多关于你的MySQLconfiguration的细节,你究竟是如何实例化连接等等。

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

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

当我的开发人员安装了一个像MAMP一样的堆栈pipe理器时,我已经看到了这种情况,这个pipe理器是在非标准位置安装了MySQL的预configuration的。

在你的terminal运行

 mysql_config --socket 

这会给你你的path到袜子文件。 采取这一path,并在您的数据库主机参数中使用它。

你需要做的是指出你的

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

注意

也运行which mysql_config如果你有多个实例的mysql服务器安装在你可能连接到错误的机器上的机器。

什么时候,如果你在Mac OSx中失去了守护进程mysql,但是在私有/ var中存在于其他path中,请执行以下命令

1)

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

2)重新启动你的连接到MySQL与:

 mysql -u username -p -h host databasename 

也适用于mariadb

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

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

在尝试了几个解决scheme并没有取得任何成功之后,这对我来说是有效的:

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

在terminal中运行下面的cmd

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

在这里输入图像说明

然后重新启动机器才能生效。 有用!!

我只是从localhost HOST更改为127.0.0.1 ,它工作正常:

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

这可能是以下问题之一。

  1. 错误的mysqllocking。 解决scheme:你必须找出正确的mysql socket,

mysqladmin -pvariables| grep套接字

然后把它放在你的db连接代码中:

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

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

2.不正确的mysql端口解决scheme:你必须找出正确的mysql端口:

 mysqladmin -p variables | grep port 

然后在你的代码中:

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

3306是从grep返回的端口

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

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

我有两个偷偷摸摸的猜测

CONJECTURE#1

看看无法访问/tmp/mysql.sock文件的可能性。 当我设置MySQL数据库时,我通常将套接字文件站点放在/var/lib/mysql 。 如果以root@localhost身份login到mysql,则您的OS会话需要访问/tmp文件夹。 确保/tmp在OS中具有正确的访问权限。 此外,请确保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@localhostlogin,但确保你已经定义了root@'127.0.0.1'

下一次你连接到MySQL,运行这个:

 SELECT USER(),CURRENT_USER(); 

这是什么给你的?

  • USER()报告你如何尝试在MySQL中进行身份validation
  • CURRENT_USER()报告你如何被允许在MySQL中进行身份validation

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

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

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

注意第一个提示!

确保你的/ etc / hosts里面有127.0.0.1 localhost ,它应该可以正常工作

检查你的mysql是否没有达到最大连接数,或者不是在某种引导循环中,如果my.cnf中的设置不正确,就会经常发生。

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

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

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

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

 shell> cd /user/local/bin 

我的mysql.server位于。 从这里input:

 shell> mysql.server start 

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

从那里你可以重置根密码,如果需要的话。

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

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

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

  • 您的/ tmp位于标准磁盘上,还是异地安装(如RAM中)?

  • 你的/ tmp是空的吗?

  • 当你遇到问题时, iotop是否显示你的问题?

我不得不通过首先find所有进程ID来closures所有的mysql实例:

ps aux | grep mysql

然后杀掉他们:

kill -9 {pid}

然后:

mysql.server启动

为我工作。

在“pipe理数据库连接”对话框中configuration数据库连接。 select“标准(TCP / IP)”作为连接方法。

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

根据这个其他页面,即使指定了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 

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

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

我用mysqld_safe&开始了服务。

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

如果是套接字相关的读取这个文件

 /etc/mysql/my.cnf 

并看看什么是标准的套接字位置。 这是一条线,如:

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

现在为你的shell创build一个别名,例如:

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

这样你就不需要root权限。

只需尝试运行mysqld

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