当我在测试套件中尝试连接到本地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)
sudo /usr/local/mysql/support-files/mysql.server start
这对我有用。但是,如果这不起作用,请确保mysqld正在运行并尝试连接。
在尝试了一些这些解决方案并且没有取得任何成功后,这对我有用:
我想我前段时间看过同样的行为,但不记得细节了。 在我们的例子中,问题是testrunner相对于所需的第一个数据库交互初始化数据库连接的时刻,例如,通过在settings.py或某些__init__.py中导入模块。我会尝试挖掘更多信息,但这可能已经为你的情况敲响了警钟。
我对这个有两个鬼鬼祟祟的猜想
看看无法访问/tmp/mysql.sock
文件的可能性。当我设置MySQL数据库时,我通常将套接字文件站点放在/var/lib/mysql
中。如果您以root@localhost
身份登录mysql,则您的操作系统会话需要访问/tmp
文件夹。确保/tmp
在操作系统中具有正确的访问权限。此外,请确保sudo用户始终可以在/tmp
中读取文件。
如果你没有注意,通过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();
这给你带来了什么?
如果这些函数返回相同的值,那么您将按预期连接和验证。如果值不同,您可能需要创建相应的用户[email protected]
。
有同样的问题。原来mysqld
已经停止运行(我在Mac OSX上)。我重新启动它,错误就消失了。
我发现mysqld
并没有因为这个链接而大量运行:http://dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html
注意第一个提示!
如果您收到如下错误:
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' : ''
}
}
确保您的/ etc / hosts中包含127.0.0.1 localhost
,它应该可以正常工作
检查你的mysql是否没有达到最大连接数,或者如果my.cnf中的设置不正确,则不会出现某种类型的启动循环。
使用ps aux | grep mysql检查PID是否正在改变。
在网上看了太长时间没有贡献。尝试从命令行输入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;
对于通过自制程序从5.7升级到8.0的用户,此错误可能是由于升级未完成造成的。在我的情况下,mysql.server start
给我带来以下错误:
错误!服务器退出而不更新PID文件
然后我通过cat /usr/local/var/mysql/YOURS.err | tail -n 50
检查了日志文件,发现以下内容:
InnoDB:不支持崩溃后升级。
如果你在同一条船上,首先通过自制软件安装[email protected]
,停止服务器,然后再次启动8.0系统。
brew install [email protected]
/usr/local/opt/[email protected]/bin/mysql.server start
/usr/local/opt/[email protected]/bin/mysql.server stop
然后,
mysql.server start
这将使你的MySQL(8.0)再次运行。
套接字位于/ tmp中。在Unix系统上,由于/ tmp上的模式和所有权,这可能会导致一些问题。但是,只要您告诉我们您可以正常使用您的mysql连接,我想这不是您系统上的问题。原始检查应该是在一个更中性的目录中重新定位mysql.sock。
问题“随机”(或不是每次)发生的事实让我认为这可能是服务器问题。
iotop
show你错了吗?MySQL手册的相关部分是here。我首先要完成那里列出的调试步骤。
另外,请记住localhost和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配置的更多详细信息,以及您如何实例化连接等。
我必须通过首先找到所有进程ID来杀死所有mysql实例:
ps到| grep mysql
然后杀掉它们:
杀死-9 {pid}
然后:
mysql.server启动
为我工作。
在“管理数据库连接”对话框中配置数据库连接。选择“标准(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
在ubuntu 14.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服务器显示问题(无法通过socket连接到mysql)。
最后,我发现当我用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
查看详细的错误日志。
对我来说问题是我没有运行mysql服务器。首先运行服务器,然后执行mysql
。
$ mysql.server start
$ mysql -h localhost -u root -p
我已经看到这种情况发生在我的工作室,当我的开发人员安装了像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
。
我刚刚将HOST
从localhost
更改为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': '',
},
...
何时,如果你在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
在终端中运行以下命令
在/ usr /本地/ MySQL的/斌/ mysqld_safe的
然后重启机器才能生效。有用!!
使用lsof命令检查mysql进程的打开文件数。
增加打开文件限制并再次运行。
这可能是以下问题之一。
mysqladmin -p变量| grep socket
然后将它放在您的数据库连接代码中:
pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock")
/tmp/mysql.sock是从grep返回的
2.Incorrect mysql端口解决方案:你必须找到正确的mysql端口:
mysqladmin -p variables | grep port
然后在你的代码中:
pymysql.connect(db='db', user='user', passwd='pwd', host='localhost', port=3306)
3306是从grep返回的端口
我认为第一个选项将解决您的问题。