Проблемы с подключением MySQLdb - PullRequest
12 голосов
/ 17 апреля 2009

У меня проблемы с модулем MySQLdb.

db = MySQLdb.connect(
    host = 'localhost', 
    user = 'root', 
    passwd = '', 
    db = 'testdb', 
    port = 3000)

(я использую пользовательский порт)

ошибка, которую я получаю:

Error 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Что не имеет особого смысла, так как это соединение по умолчанию, установленное в my.conf .. это как если бы оно игнорировало информацию о соединении, которую я предоставляю ..

Сервер mysql определенно существует:

[root@baster ~]# mysql -uroot -p -P3000
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use testdb;
Database changed
mysql> 

Я пытался прямо из приглашения python:

>>> db = MySQLdb.connect(user='root', passwd='', port=3000, host='localhost', db='pyneoform')
Traceback (most recent call last):
File "", line 1, in 
File "/usr/lib64/python2.5/site-packages/MySQLdb/__init__.py", line 74, in Connect
return Connection(*args, **kwargs)
File "/usr/lib64/python2.5/site-packages/MySQLdb/connections.py", line 169, in __init__
super(Connection, self).__init__(*args, **kwargs2)
_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)")
>>>

Я в замешательстве ...: (

Ответы [ 7 ]

49 голосов
/ 26 июня 2011

Изменение localhost на 127.0.0.1 решило мою проблему, используя MySQLdb:

db = MySQLdb.connect(
    host = '127.0.0.1', 
    user = 'root', 
    passwd = '', 
    db = 'testdb', 
    port = 3000)

Использование 127.0.0.1 заставляет клиента использовать TCP / IP, чтобы сервер, прослушивающий порт TCP, мог зафиксировать его. Если host указано как localhost, будет использоваться сокет или канал Unix.

10 голосов
/ 07 мая 2009

add unix_socket='path_to_socket', где path_to_socket должно быть путем к сокету MySQL, например /var/run/mysqld/mysqld2.sock

3 голосов
/ 15 июля 2010

У меня была проблема, когда файл сокета unix находился где-то еще, python пытался подключиться к несуществующему сокету. Как только это было исправлено с помощью опции unix_socket, это сработало.

3 голосов
/ 17 апреля 2009

Убедитесь, что сервер mysql прослушивает TCP-соединения, что вы можете сделать с помощью netstat -nlp (в * nix). Это тип соединения, которое вы пытаетесь установить, и БД обычно не прослушивают сеть по умолчанию из соображений безопасности. Кроме того, попробуйте указать --host = localhost при использовании команды mysql, также попытайтесь подключиться через сокеты Unix, если не указано иное. Если mysql не настроен на прослушивание tcp-соединений, команда также не будет выполнена.

Вот соответствующий раздел руководства mysql 5.1 , посвященный сокетам Unix и соединениям для устранения неполадок. Обратите внимание, что описанная ошибка (2002) является той же самой, которую вы получаете.

В качестве альтернативы, проверьте, есть ли у используемого вами модуля возможность подключения через сокеты Unix (как предлагает Дэвид).

1 голос
/ 25 января 2011

Mysql использует сокеты, когда хостом является localhost, и tcp / ip, когда хостом является что-то еще. По умолчанию Mysql будет слушать оба - вы можете отключить сокеты или сетевые подключения в вашем файле my.cnf (подробности см. На mysql.com).

В вашем случае забудьте о port = 3000, в котором клиент mysql lib не обращает на это никакого внимания, поскольку вы используете localhost, и укажите сокет как в unix_socket = 'path_to_socket'.

Если вы решили переместить этот скрипт на другой компьютер, вам нужно будет изменить эту строку подключения, чтобы использовать фактическое имя хоста или IP-адрес, а затем вы можете потерять unix_socket и вернуть порт. Порт по умолчанию для mysql - 3306 - вам не нужно указывать этот порт, но вам нужно будет указать 3000, если это порт, который вы используете.

0 голосов
/ 04 сентября 2009

Насколько я могу судить, коннектор python может ТОЛЬКО подключаться к mysql через интернет-сокет: сокеты unix (по умолчанию для клиента командной строки) не поддерживаются.

В клиенте CLI, когда вы говорите "-h localhost", он фактически интерпретирует localhost как "О, localhost? Вместо этого я просто подключусь к сокету unix", а не к сокету localhost в Интернете.

Т.е. клиент CLI mysql делает что-то волшебное, а коннектор Python делает что-то "последовательное, но ограничительное".

Выбери свой яд. (Пан не предназначен;))

0 голосов
/ 17 апреля 2009

Возможно, попробуйте добавить параметр ключевого слова unix_socket = None в connect()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...