Traceback (most recent call last): File "./test_db.py", line 12, in < module> db='mysite') File "build/bdist.linux-x86_64/egg/MySQLdb/__init__.py", line 81, in Connect File "build/bdist.linux-x86_64/egg/MySQLdb/connections.py", line 187, in __init__ _mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)")
這裏主要是由於咱們鏈接mysql的時候,host用的是localhost, 實際用的是UNIX Domain Socket(具體見參考文獻(1))來進行通訊的。咱們知道,UNIX Domain Socket的地址是一個socket類型的文件在文件系統中的路徑,若是這個路徑不存在的話,鏈接的時候就會失敗。上面提示的錯誤緣由是」Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)」,從字面意思上來看,是說沒法經過’/var/lib/mysql/mysql.sock’這個socket來鏈接本地的mysql sever,這時候問題基本就比較明顯了,應該是mysql配置的本地鏈接的socket不是’/var/lib/mysql/mysql.sock’這個路徑的緣由。接下來咱們來驗證咱們的想法,打開mysql的配置文件(/etc/my.cnf),咱們看到以下的內容:html
咱們能夠看到,本地mysql server配置的Unix Domain Socket是/tmp/mysql.sock,與上面python MySQLdb所用的不同,這也印證了咱們前面的猜測,找到了問題的緣由。python
3. 解決問題的方法mysql
知道了問題所在,咱們就能夠對症下藥了,下面提供幾種能夠解決問題的方案:
(1)在python MySQLdb鏈接的時候,指定所用的unix_socketlinux
1 2 3 4 5 6 |
db MySQLdb.host port passwd db unix_socket |
(2)修改本地mysql server的UNIX Domain Socketweb
1 2 3 4 5 6 7 8 9 10 11 12 |
# The following options will be passed to all MySQL clients [client] #password = your_password port = 3306 socket = /var/lib/mysql/mysql.sock # The MySQL server [mysqld] bind-address = 10.12.22.98 port = 3306 socket = /var/lib/mysql/mysql.sock # ... |
(3)修改本地mysql server支持遠程訪問(具體見參考文獻(2)),採用普通socket進行鏈接sql
1 2 3 4 5 |
db MySQLdb.host port passwd db |
4. 參考文獻shell
(1)Unix Domain Socket
(2)mysql支持遠程訪問socket