Utracono połączenie z serwerem MySQL podczas odczytu początkowego pakietu komunikacyjnego, błąd systemu: 0

127

Otrzymuję błąd:

„Utracono połączenie z serwerem MySQL podczas odczytu początkowego pakietu komunikacyjnego, błąd systemu: 0”

podczas gdy mam zamiar podłączyć moją bazę danych.

Jeśli używam localhost, wszystko działa dobrze. Ale kiedy używam mojego rzeczywistego adresu IP, jak poniżej, pojawia się błąd:

mysql_connect("202.131.xxx.106:xxxx", "xxxx", "xxxxx") or die(mysql_error());
Rikesh
źródło

Odpowiedzi:

104

Ktoś tutaj sugeruje, że może to być problem z zaporą ogniową:

Właśnie miałem ten problem i stwierdziłem, że to moja zapora. Używam PCTools Firewall Plus i nie pozwalał on na pełny dostęp do MySQL. Raz zmieniłem, że było dobrze. Mam nadzieję, że to pomoże.

Czy to możliwe?

Ktoś tutaj sugeruje również, że może to być spowodowane tym, że serwer MySQL jest powiązany z adresem IP pętli zwrotnej (127.0.0.1 / localhost), co skutecznie odcina cię od łączenia się „z zewnątrz”.

W takim przypadku musisz przesłać skrypt na serwer sieciowy (na którym prawdopodobnie działa również serwer MySQL) i zachować hosta serwera jako „localhost”

Thomas Daugaard
źródło
7
co masz na myśli localhost? Mam również ten sam problem i używam tylko localhost. Aplikacja znajduje się na tym samym komputerze, co baza danych. Co masz na myśli lokalnego hosta?
oneofakind
6
@oneofakind Chce połączyć się z „localhost” zamiast „127.0.0.1”
Alex Holsgrove
2
Miałem ten sam problem na OSX z mamp pro. Naprawiłem to, wyłączając / ponownie włączając pole wyboru „Zezwól na dostęp sieciowy do mysql” na karcie mamp pro mysql.
Ousmane
43

Otwórz plik konfiguracyjny mysql o nazwie my.cnf i spróbuj znaleźć „adres-wiązania”, w tym miejscu zastąp ustawienie (127.0.0.1 OR localhost) adresem IP serwera na żywo (IP, którego używasz w funkcji mysql_connect)

To zdecydowanie rozwiąże problem.

Dzięki

intekhab rizvi
źródło
2
Upewnij się, że używasz bind-address = 127.0.0.1 lub localhost podczas korzystania z tunelu ssh. Miałem ten problem z bitnami, gdzie adres-wiązania to adres IP maszyny.
z2z
1
Ten sam problem i rozwiązanie dla samodzielnego serwera dedykowanego Debian 10 + MySQL.
Vilq
Należy wspomnieć, że generalnie lepiej byłoby powiązać usługę mysql z usługą mysql, 127.0.0.1jeśli ma to zastosowanie, aby bezpośredni dostęp z innych hostów nie był możliwy. Zapobiega to zdalnym atakom siłowym i nie ujawnia potencjalnych problemów z bezpieczeństwem w sieci. Jeśli twoja aplikacja znajduje się na tym samym komputerze (co jest bardzo powszechną konfiguracją hostingu), użyj 127.0.0.1odp. localhostjako host mysql i będzie działać w taki sam sposób, jak powiązanie usługi z zewnętrznym interfejsem i użycie go jako hosta mysql. Jeśli Twoja aplikacja znajduje się w innym miejscu, użyj sieci wewnętrznej, jeśli to możliwe.
David
36

1) Zezwól na zdalne połączenie z MySQL. Edytuj plik:

>sudo nano /etc/mysql/my.cnf

Linia komentarza:

#bind-address       = 127.0.0.1

Uruchom ponownie MySQL:

>sudo service mysql restart

2) Utwórz użytkownika do zdalnego połączenia.

>mysql -uroot -p

CREATE USER 'developer'@'localhost' IDENTIFIED BY 'dev_password';
CREATE USER 'developer'@'%' IDENTIFIED BY 'dev_password';

GRANT ALL ON *.* TO 'developer'@'localhost';
GRANT ALL ON *.* TO 'developer'@'%';

3) W moim przypadku muszę połączyć się zdalnie z Windowsa do maszyny VirtualBox z Ubuntu. Więc muszę zezwolić na port 3306 w iptables:

>iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
sNICkerssss
źródło
1
Dla mnie zapomniałem zweryfikować adres powiązania na my.cnf. Dzięki.
abkrim,
1
To całkowicie pomogło. Dziękuję Ci!
osehgol
1
Działało idealnie, ale używałem środowiska roboczego w systemie Windows, więc nie wykonałem kroku 3., ale zadziałało. Dzięki!
RohitAneja
Chociaż ostatnie polecenie nie zadziałało dla mnie, utworzenie nowego użytkownika na swój sposób rozwiązało mój problem. Mam dostęp do mysql na raspberry pi z mojego laptopa. Dzięki!
Eyyüp Alkış
pamiętaj, aby FLUSH PRIVILEGESpo utworzeniu nowego użytkownika.
Yew Hong Tat
15

Miałem ten problem podczas konfigurowania nowego serwera podrzędnego. Okazało się, że w /etc/hosts.allowpliku serwera głównego brakuje adresu IP serwera slave . Dodano adres IP i pozwolił mi połączyć się z serwerem głównym.

Zauważ, że używam hosts.allowi hosts.denydo kontrolowania dostępu.

znak
źródło
mój problem z łącznikiem / c ++. teraz, gdybym tylko mógł znaleźć, jakie ustawienie musi być, allowkiedy denyma ALL: ALL...
to naprawdę uratowało mi życie, miałem problemy z połączeniem się z mysql z warsztatu, musiałem dodać „ALL: 127.0.0.1” do pliku /etc/hosts.allow i zaczęło działać
Tomáš Tibenský
W moim przypadku / etc / hosts zawierał zły (stary) wpis dla adresu IP hosta. Po wydaniu nowego adresu IP znajdował się pod starym i pozornie został zignorowany. Usunięcie starego adresu IP naprawiło błąd.
David Ramirez
7

Miałem ten problem i skończyło się na tym, że poprzedni administrator systemu zmienił port, na którym działa MySQL. MySQL Workbench próbował połączyć się z domyślnym 3306, ale serwer działał na 20300.

user3347295
źródło
1
Dobra rzecz dla tej odpowiedzi. Okazuje się, że zrobiłem to sobie.
cautionbug
5

Problem w moim przypadku polegał na tym, że MySQL wiązał się tylko z lo w systemie Linux. w celu rozwiązania problemu wyedytowałem plik my.cnf (znajdujący się w /etc/mysql/my.cnf) usuwając wiersz bind-address = 127.0.0.1

pozwala to mysql na powiązanie z dowolnym interfejsem sieciowym

Renato Mendes
źródło
5

Ten błąd wystąpił podczas próby połączenia się z Google Cloud SQL za pomocą MySQL Workbench 6.3.

Po krótkich poszukiwaniach odkryłem, że mój adres IP został zmieniony przez dostawcę Internetu i nie został on dopuszczony do Cloud SQL.

Autoryzowałem to i wróciłem do pracy.

Paulo Occaso
źródło
4

Napotkałem dokładnie ten sam błąd podczas łączenia się z MySQL. Oto jak to naprawiłem. Mój plik konfiguracyjny /etc/my.cnf miał wartość bind-address ustawioną na adres IP serwera. Trzeba było to zrobić, aby skonfigurować replikację. W każdym razie rozwiązałem to, robiąc dwie rzeczy:

  1. utwórz użytkownika, którego będzie można używać do łączenia się z adresem powiązania w pliku my.cnf

na przykład

CREATE USER 'username'@'bind-address' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON schemaname.* TO 'username'@'bind-address';
FLUSH PRIVILEGES;
  1. zmień wartość nazwy hosta MySQL w szczegółach połączenia w środowisku roboczym MySQL, aby była zgodna z adresem powiązania
Tishan
źródło
Dziękuję bardzo, mieliśmy również replikację MySQL, a adres wiązania był adresem lokalnym: 10.0.0.x. Od wielu dni walczyłem o to rozwiązanie.
iFadi
3

Problem polegał na tym, że zapytania DNS były blokowane przez FW w podsieci. Rozwiązaniem było wyłączenie wyszukiwania DNS w MySQL.

Bill Grady
źródło
Podejrzewam, że w moim przypadku winien jest również DNS.
Zenexer
3

Właśnie skonfigurowałem mysql na skrzynce z systemem Windows. Otrzymałem błąd OP podczas próby połączenia się z klientem Navicat MySql na tym samym urządzeniu. Musiałem określić 127.0.0.1 jako hosta i to dostało.

localhost lub rzeczywisty adres IP serwerów nie działa.

Paul B.
źródło
3

Błąd oznacza, że ​​nie otrzymał odpowiedzi z portu, na którym powinien znaleźć serwer. Przyczyny mogą być różne, od skontaktowania się z niewłaściwą maszyną (z kilku powodów) do braku połączenia serwera z oczekiwanym portem.

Sprawdź, do którego portu jest przypisany twój serwer w /etc/mysql/my.cnf. Czy to odpowiada temu, co jest w twojej instrukcji connect. Jeśli pasują, spróbuj połączyć się z mysql z samego serwera iz wiersza poleceń maszyny, na której uruchamiasz klienta. Jeśli działa w jednym miejscu, a nie w innym, możesz mieć problem z konfiguracją zapory / routera.

ClearCrescendo
źródło
Nie sądzę, żeby to było poprawne, jeśli nic nie nasłuchuje na tym porcie, otrzymasz odpowiedź ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61), a nie Lost connection to MySQL serverwiadomość.
Ken Williams
2

w moim przypadku miałem ALL: ALL w hosts.deny. Zmiana tego na ALL: PARANOID rozwiązał mój problem podczas łączenia przez ssh

domoarigato
źródło
2

Problem był dla mnie dość głupi.

Kiedyś otrzymywałem ten sam problem na maszynie AWS EC2 Ubuntu (MariaDB jest na razie instalowana lokalnie), więc próbowałem wykonać tunelowanie SSH i miałem ten sam problem. Więc próbowałem przejść przez tunel ssh nad terminalem:

ssh -L13306:127.0.0.1:3306 root@ip.address -i my/private/key.pem

I powiedział mi to:

Zaloguj się jako użytkownik „ubuntu”, a nie jako użytkownik „root”.

Zmieniłem użytkownika ssh z roota na ubuntu, tak jak moja konfiguracja ssh i połączyłem się dobrze.

Sprawdź więc swojego użytkownika łączącego się przez SSH.

Nadzorowałem to, więc to też pół godziny mojego czasu, więc mam nadzieję, że ci się to przyda.

Arda
źródło
2

Dla mnie plik konfiguracyjny został znaleziony "/etc/mysql/mysql.conf.d/mysqld.cnf". Komentowanie adresu wiązania załatwiło sprawę.

Jak widzimy tutaj: zamiast przeskakiwania sieci domyślnie nasłuchuje się tylko na hoście lokalnym, który jest bardziej kompatybilny i nie mniej bezpieczny.

scott
źródło
Ku mojemu największemu zdziwieniu ten działał pod Debianem 10. Dałem na to szansę i DZIAŁA! Edytowałem konfigurację mysql sudo nano /etc/mysql/mariadb.conf.d/50-server.cnfi zamiast tego bind-address = 111.112.113.114użyłem bind-address = 127.0.0.1. Ustawienia tunelu SSH są ustawione zgodnie z opisem na hostpresto.com/community/tutorials/ ... Dobra robota! Dzięki!
klor
1

Wpadłem na ten sam problem, Bind Address tam iz powrotem bezskutecznie. Rozwiązaniem dla mnie było spłukiwanie przywilejów .

mysql> FLUSH PRIVILEGES;
Marko Bajlovic
źródło
1

Dla mnie ustawienie bind-address = 0.0.0.0w mysql/my.cnfzadziałało. Zasadniczo nasłuchuje wtedy wszystkich adresów (ale nadal jednego portu).

I nie zapomnij zrestartować serwera: systemctl restart mysql

Jahanzeb Khan
źródło
6
Wszystkie adresy / interfejsy, ale tylko jeden port.
Zenexer
1

Po prostu miałem ten sam problem, ale w moim przypadku rozwiązałem go

usługa mysqld start

GunSky7
źródło
1

Jeszcze jeden powód ...

Wpadłem na serwer Ubuntu, na którym wszystko zostało dostosowane i nie mogłem się połączyć z powodu tego samego błędu.

To ustawienie było w środku /etc/ssh/sshd_config

PermitTunnel no

Po zmianie w

PermitTunnel yes

Udało mi się połączyć zdalnie z moją bazą danych MySQL

lewis4u
źródło
1

Próbuję podłączyć mój kontener DB Docker na Ubuntu 18.04, ten sam problem.

Najpierw sprawdź urządzenie, uruchamiając, nmcli devaby sprawdzić, czy docker0jest podłączone.

Jeśli nie jest podłączony, spróbuj ponownie uruchomić usługę docker:

sudo service docker restart

Pasować
źródło
1

W moim przypadku był to uniwersytecki port blokujący WiFi 3306. Udało mi się połączyć za pomocą mobilnego hotspotu.

Zmień na mobilny punkt dostępu lub inną sieć i jeśli tam działa, wiesz, że oryginalna sieć blokuje port 3306. Jeśli ten sam błąd występuje w więcej niż jednej sieci, oznacza to, że jest on specyficzny dla twojego komputera.

R Diaz
źródło
1

Firewalldblokuje adres IP. aby dać dostęp, użyj tych poleceń:

firewall-cmd --permanent --zone = trust --add-source = TWÓJ_IP / 32

firewall-cmd --permanent --zone = trust --add-port = 3306 / tcp

firewall-cmd --reload

Rodniko
źródło
0

Łącząc się zdalnie z MySQL wyskoczył mi błąd. Miałem to ostrzeżenie w /var/log/mysqld.log:

[Warning] IP address 'X.X.X.X' could not be resolved: Temporary failure in name resolution

Właśnie dodałem tę linię do /etc/hostspliku:

X.X.X.X some_name

Problem rozwiązany! Nieużywanie skip-name-resolvepowodowało błędy w mojej aplikacji lokalnej podczas łączenia się z MySQL.

Amin Sh
źródło
0

Miałem identyczny problem. Aby to naprawić, właśnie zmieniłem hosta z localhost: 3306 na po prostu localhost. Więc błąd może się pojawić, gdy wybierzesz niewłaściwy port do połączenia. Lepiej pozostawić to domyślne.

Barto
źródło
1
Jest to prawdopodobne, ponieważ mysql nie akceptuje portu jako części nazwy hosta, zamiast tego musisz użyć argumentu-P 3306
Clay H
0

Problem, który znalazłem w katalogu bazy danych do odczytu i zapisu. Po prostu upewnij się, że Twoja aplikacja może rw pliki w lokalizacji db. Wypróbuj chmod 777 do testów.

Abbas
źródło
0

Miałem ten sam problem. Sprawdziłem i próbowałem ustawić AllowTcpForwarding Tak, ale brakowało go w moim sshd_config, więc nie ma pomocy. Nie zmieniłem sshd_config ani my.cnf. Upewnij się, że nazwa hosta ssh NIE jest taka sama jak nazwa hosta mysql (użyj localhost).

W środowisku roboczym wybierz +, aby dodać nowe połączenie i ustaw następujące opcje:

  • metoda połączenia: standardowy TCP / IP przez SSH
  • Nazwa hosta SSH: 192.168.0.50:22 (zastąp adres IP i port zdalnego serwera SSH (opcjonalnie))
  • Nazwa użytkownika SSH: sshuser
  • Możesz ustawić hasło lub dodać je po monicie
  • Nazwa hosta MYSQL: localhost lub 127.0.0.1
  • Port serwera MYSQL: 3306
  • Możesz ustawić hasło lub dodać je po monicie

Testuj połączenie. Powinno się udać, a następnie naciśnij OK, Viola!

Reagan Ochora
źródło
0

Jeśli adres-wiązania nie jest obecny w pliku konfiguracyjnym, a mysql jest hostowany na instancji AWS, sprawdź swoją grupę bezpieczeństwa. W idealnych warunkach reguły przychodzące powinny akceptować wszystkie połączenia z portu 3306, a reguła wychodząca powinna odpowiadać na wszystkie prawidłowe adresy IP.

Aman Bansal
źródło
0

Zrobiłem poniżej 3 kroki, a następnie pracowałem dla mnie.

  1. bind-address = "YOUR MACHINE IP"w my.cnfpliku w /etc/my.cnf

  2. Uruchom ponownie usługę za pomocą polecenia: service httpd restart

  3. GRANT ALL PRIVILEGES ON yourDB.* TO 'username'@'YOUR_APPLICATION_IP' IDENTIFIED BY 'YPUR_PASSWORD' WITH GRANT OPTION;

Kamal Oberoi
źródło
0

Miałem podobny błąd (łączenie się z MYSQL na aws przez MYSql Workbench). Kiedyś łączyłem się dobrze wcześniej i nagle przestało działać i po prostu nie działało ponownie). Moje połączenie było zabezpieczone przez SSH przez plik klucza.

Okazuje się, że upłynął limit czasu. Więc zwiększyłem limit czasu połączenia SQL do 30 sekund (z domyślnych 10) i dobrze było iść ponownie. rzeczy do wypróbowania (jeśli jesteś w podobnej konfiguracji)

  1. Czy możesz ssh bezpośrednio z terminala na serwer (wykrywa problemy z uprawnieniami do plików kluczy itp.)?
  2. Czy możesz wtedy połączyć się przez terminal z MySQL z tym samym użytkownikiem / pwd używając czegoś takiego jak mysql -u [username] -p [database] ? Spowoduje to sprawdzenie problemów z prawami użytkownika itp.
  3. jeśli oba te elementy działają, to twoje parametry nie są problemem i może ten sam problem z limitem czasu jak ja (z wyjątkiem tego, że nigdy nie powiedział o błędzie przekroczenia limitu czasu, ale raczej poproszono o sprawdzenie uprawnień itp.)
Burges K
źródło
0

Ograniczona przestrzeń dyskowa może spowodować ten błąd.

Sprawdź miejsce na dysku

$ df -h

Spróbuj zwiększyć ilość miejsca, jeśli jest 100% używanych dysków.

W moim przypadku: mam Vagrant (8.0.1) box (Ubuntu 16.04) Moja pojemność dysku mysql wynosiła 10 GB, zwiększyłem ją do 20 GB

$ sudo lvextend -L20G -r /dev/mapper/homestead--vg-mysql--master

Następnie uruchom ponownie mysql

$ sudo service mysql restart
Sadee
źródło
0

Jeśli napotkasz ten błąd podczas łączenia się ze zdalnego, przejdź do opcji zdalnego mysql w cpanelu, a następnie dodaj% w Host (dozwolone są symbole wieloznaczne%).

Jan
źródło