Проблемы с соединением Python: MySQLdb

У меня возникают проблемы с модулем 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> 

Я попробовал прямо из приглашения 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)")
>>>

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

Ответ 1

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

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

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

Ответ 2

Изменение 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 или труба.

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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