2009-04-17 24 views
11

У меня возникают проблемы с модулем MySQLdb.Python: Проблемы с подключением 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 сервер, безусловно, есть:

 
[[email protected] ~]# 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> 

Я попытался непосредственно из питона строки:

 
>>> 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)") 
>>> 

Я запутался ... :(

ответ

3

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

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

В качестве альтернативы, проверьте, есть ли у модуля, который вы используете, возможность подключения через разъемы unix (как предлагает David Suggestests).

+0

Proto Recv-Q Send-Q Локальный адрес Адрес иностранного адреса PID/Название программы tcp 0 0 0.0.0.0:3300 0.0.0.0:* LISTEN 5361/mysqld – Ian

+0

Да , мой плохой, в приведенных выше примерах я написал порт 3000. Я исправил это .. и странно, проблема сохраняется. хе. тьфу. – Ian

+0

Вы перезапустили сервер с момента обновления конфигурации? –

-1

Может попробовать добавить параметр ключевого слова unix_socket = None в connect()?

+0

Просто попробовал, что ему не нравится None, поэтому я сделал это вместо этого, и теперь он жалуется, что '' не является допустимым сокетом. странно, это похоже на то, что он хочет только подключиться через сокет. – Ian

8

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

-1

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

В клиенте CLI, когда вы говорите «-h localhost», он на самом деле интерпретирует localhost как «О, localhost? Я просто подключусь к unix-сокету вместо», а не к локальному хосту Internet.

Т.е. клиент CLI mysql делает что-то магическое, а соединитель Python делает что-то «последовательное, но ограничительное».

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

+0

Это совершенно неправильно. Если вы попытаетесь подключиться к «127.0.0.1», вы будете подключаться через TCP/IP. Если вы попытаетесь подключиться к 'localhost', вы будете подключаться через unix-сокеты. Соединитель по умолчанию для MySQL обычно является '/ tmp/mysql.sock', но если ваш сокет находится где-то в другом месте, вы должны указать, где он использует' unix_socket = '/ path/to/mysql.sock' – daviewales

3

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

1

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

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

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

44

Изменение 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.

+1

, это решило мою проблему слишком.Благодарю. – Vineet

+1

Да, это особенно сложно: запрос на TCP-соединение через «localhost» вызывает ошибку сокета unix. – mathieu

+1

Удивительно, это решило мою проблему тоже! Это работает с XAMPP и Big Brother Bot (B3)! – gaborous

Смежные вопросы