2009-04-17 16 views
11

Mam problem z modułem MySQLdb.Python: Problemy z połączeniem MySQLdb

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

(używam port niestandardowy)

błąd pojawia się:

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

Co nie ma sensu, ponieważ jest to domyślne ustawienie połączenia w my.conf .. to tak, jakby to ignorując informacje Connection dam ..

serwera MySQL jest tam zdecydowanie:

 
[[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> 

Próbowałem bezpośrednio z wiersza Pythona:

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

Jestem zdezorientowany ... :(

Odpowiedz

3

Upewnij się, że serwer mysql nasłuchuje połączeń TCP, które możesz wykonać za pomocą polecenia netstat -nlp (in * nix). Jest to typ połączenia, którego próbujesz dokonać, a bazy danych nie są domyślnie słuchane w sieci ze względów bezpieczeństwa. Spróbuj także podać --host = localhost podczas używania komendy mysql, to także spróbuj połączyć się przez gniazda uniksowe, chyba że określisz inaczej. Jeśli mysql jest , a nie skonfigurowany do nasłuchiwania połączeń TCP, polecenie również nie powiedzie się.

Oto odpowiednia sekcja z mysql 5.1 manual na gniazdach unixowych i rozwiązywaniu problemów. Zauważ, że opisany błąd (2002) jest tym samym, który otrzymujesz.

Ewentualnie sprawdź, czy używany moduł ma opcję łączenia się przez gniazda uniksowe (jak sugeruje David).

+0

Proto Recv-Q Wyślij-Q Adres lokalny Adres obcy Stan PID/Nazwa programu tcp 0 0 0.0.0.0:3300 0.0.0.0:* LISTEN 5361/mysqld – Ian

+0

Tak , mój zły, w powyższych przykładach napisałem port 3000. Naprawiłem to ... i dziwnie, problem nadal istnieje. heh. ugh. – Ian

+0

Czy zrestartowałeś serwer od czasu aktualizacji konfiguracji? –

-1

Może spróbuj dodać parametr Hasło unix_socket = None do connect()?

+0

Próbowałem tego, nie podoba mi się None, więc zrobiłem to, a teraz narzeka, że ​​to nie jest poprawne gniazdo. Dziwne, to tak, jakby chciał tylko połączyć się przez gniazdo. – Ian

8

dodać unix_socket='path_to_socket' gdzie path_to_socket powinna być ścieżką do gniazda MySQL, np. /var/run/mysqld/mysqld2.sock

-1

Z tego co wiem, złącze Pythona może TYLKO połączyć się z MySQL przez gniazdo internetowe: gniazda uniksowe (domyślne dla klienta linii poleceń) nie są obsługiwane.

W kliencie CLI, kiedy mówisz "-h localhost", to faktycznie interpretuje localhost jako "Oh, localhost? Będę po prostu połączyć się z gniazdem unix zamiast" zamiast gniazda internetowego localhost.

Tj. Klient mysql CLI robi coś magicznego, a złącze Python robi coś "spójnego, ale restrykcyjnego".

Wybierz swoją truciznę. (Pun nie zamierzony;))

+0

To jest całkowicie błędne. Jeśli spróbujesz połączyć się z '127.0.0.1', połączysz się przez TCP/IP. Jeśli spróbujesz połączyć się z 'localhost', połączysz się przez gniazda unix. Domyślnym gniazdem dla MySQL jest zwykle '/ tmp/mysql.sock', ale jeśli twoje gniazdo jest gdzieś indziej, musisz określić, gdzie używasz' unix_socket = '/ path/to/mysql.sock' – daviewales

3

Miałem ten problem, gdy plik gniazda unix był jakimś innym miejscem, pyton próbował połączyć się z nieistniejącym gniazdem. Po poprawieniu tego przy użyciu opcji unix_socket zadziałało.

1

Mysql używa gniazd, gdy hostem jest "localhost" i tcp/ip, gdy hostem jest cokolwiek innego. Domyślnie Mysql będzie nasłuchiwał obu - możesz wyłączyć gniazda lub sieć w pliku my.cnf (szczegóły na stronie mysql.com).

W twoim przypadku zapomnij o porcie = 3000 mysql client lib nie zwraca na niego uwagi, ponieważ korzystasz z localhost i określasz gniazdo jak w unix_socket = 'path_to_socket'.

Jeśli zdecydowałeś się przenieść ten skrypt na inny komputer, będziesz musiał zmienić ten ciąg połączenia tak, aby używał rzeczywistej nazwy hosta lub adresu ip, a następnie możesz utracić unix_socket i przywrócić port. Domyślny port dla mysql to 3306 - nie musisz określać tego portu, ale musisz określić 3000, jeśli jest to port, którego używasz.

44

Zmiana localhost do 127.0.0.1 rozwiązać mój problem przy użyciu MySQLdb:

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

Korzystanie 127.0.0.1 zmusza klienta do korzystania z protokołu TCP/IP, dzięki czemu serwer słuchanie portu TCP może marynowane go. Jeśli host zostanie określony jako localhost, zostanie użyte gniazdo lub rura Unix.

+1

. To rozwiązało mój problem także.Dzięki. – Vineet

+1

tak, jest to szczególnie trudne: żądanie połączenia TCP przez "localhost" wyzwala błąd gniazda unixowego. – mathieu

+1

niesamowite, to rozwiązało również mój problem! Działa to z XAMPP i Big Brother Bot (B3)! – gaborous

Powiązane problemy