Проблемы с соединением 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 не предназначен;))