今天在使用sqlalchemy连接mysql时报以下错误:
sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2002, "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)”)
上网查找原因,大部分回答主要集中在以下几点:
-
是否安装mysql server,如果没有则安装并启动。
-
查看mysqld是否启动,通过service mysql status来查看,如果没有启动,则通过service mysql start来启动。
-
通过以下几种方法确认mysql的socket 文件位置:
在mysql中执行:
mysql> show variables like 'socket';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| socket | /tmp/mysql.sock |
+---------------+-----------------+
1 row in set (0.00 sec)
或者通过/etc/my.cnf中的[mysqld]查看socket配置项:
# The MySQL server
[mysqld]
datadir = /var/lib/mysql
port = 3306
socket = /tmp/mysql.sock
或者通过ps -ef | grep mysqld查看socket配置项:
[root@centos python]# ps -ef | grep mysqld
mysql 10707 1 0 12:26 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql 11051 10707 0 12:26 ? 00:00:01 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=VM_21_76_centos.err --pid-file=VM_21_76_centos.pid --socket=/tmp/mysql.sock --port=3306
root 14980 3831 0 13:08 pts/7 00:00:00 grep --color=auto mysqld
通过实践,确认1、2都没问题,通过3确认了mysql的socket文件是/tmp/mysql.sock。现在的问题就比较明显了,sqlalchemy在连接mysql时用的socket文件是/var/lib/mysql/mysq.sock,而各种配置表明这不是mysql运行时的socket文件,且这个文件压根不存在!
为什么sqlalchemy在连接mysql时用的是这个socket文件?不得而知,想去弄清楚,但一番努力后放弃了,希望有大神能指点一下。虽然不知道为什么会这样,但可以通过在sqlalchmey的connection url中指定socket文件的路径来绕过这个问题。即设置connection url为下面的格式:
url = 'mysql://user:password@localhost/your_db?unix_socket=/tmp/mysql.sock'