Sambungan terputus ke server MySQL saat 'membaca paket komunikasi awal', kesalahan sistem: 0

127

Saya mendapatkan kesalahan:

"Sambungan terputus ke server MySQL saat 'membaca paket komunikasi awal, kesalahan sistem: 0"

sementara saya akan menghubungkan db saya.

Jika saya menggunakan localhost semuanya berfungsi dengan baik. Tetapi ketika saya menggunakan alamat IP langsung saya seperti di bawah ini, ada kesalahan:

mysql_connect("202.131.xxx.106:xxxx", "xxxx", "xxxxx") or die(mysql_error());
Rikesh
sumber

Jawaban:

104

Seseorang di sini menyarankan bahwa itu mungkin masalah firewall:

Saya baru saja mengalami masalah ini dan ternyata itu adalah firewall saya. Saya menggunakan PCTools Firewall Plus dan itu tidak memungkinkan akses penuh ke MySQL. Suatu kali saya berubah bahwa itu baik-baik saja. Semoga itu bisa membantu.

Mungkinkah itu?

Juga, seseorang di sini menyarankan bahwa itu mungkin karena server MySQL terikat ke IP loop-back (127.0.0.1 / localhost) yang secara efektif memotong Anda dari menghubungkan dari "luar".

Jika demikian, Anda perlu mengunggah skrip ke server web (yang mungkin juga menjalankan server MySQL) dan menjaga host server Anda sebagai 'localhost'

Thomas Daugaard
sumber
7
apa maksudmu localhost? Saya juga menghadapi masalah yang sama dan hanya menggunakan localhost. Aplikasi ada di mesin yang sama dengan database. Apa maksudmu localhost?
oneofakind
6
@oneofakind Maksudnya untuk terhubung ke 'localhost "alih-alih' 127.0.0.1 '
Alex Holsgrove
2
Saya memiliki masalah yang sama pada OSX dengan mamp pro. Saya memperbaikinya dengan menonaktifkan / mengaktifkan kembali kotak centang "izinkan akses jaringan ke mysql" pada tab mamp pro mysql.
Ousmane
43

Buka file konfigurasi mysql bernama my.cnf dan coba cari "bind-address", di sini ganti pengaturan (127.0.0.1 ATAU localhost) dengan ip server langsung Anda (ip yang Anda gunakan dalam fungsi mysql_connect)

Ini pasti akan menyelesaikan masalah.

Terima kasih

intekhab rizvi
sumber
2
Pastikan Anda menggunakan bind-address = 127.0.0.1 atau localhost saat menggunakan ssh tunnel. Punya masalah ini dengan bitnami, di mana bind-address adalah mesin ip.
z2z
1
Masalah dan solusi yang sama untuk Debian 10 + dedicated server mandiri MySQL.
Vilq
Harus disebutkan bahwa biasanya lebih disukai untuk mengikat layanan mysql ke 127.0.0.1tempat yang berlaku sehingga akses langsung dari host lain tidak mungkin. Ini mencegah serangan brute force jarak jauh dan tidak memaparkan kemungkinan masalah keamanan ke jaringan. Jika aplikasi Anda terletak di mesin yang sama (yang merupakan pengaturan hosting yang sangat umum), gunakan 127.0.0.1resp. localhostsebagai host mysql dan itu akan bekerja dengan cara yang sama seperti mengikat layanan ke antarmuka eksternal Anda dan menggunakannya sebagai host mysql. Jika aplikasi Anda berada di tempat lain, gunakan jaringan internal jika memungkinkan.
David
36

1) Izinkan koneksi jarak jauh ke MySQL. Edit file:

>sudo nano /etc/mysql/my.cnf

Baris komentar:

#bind-address       = 127.0.0.1

Mulai ulang MySQL:

>sudo service mysql restart

2) Buat pengguna untuk koneksi jarak jauh.

>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) Dalam kasus saya, saya perlu menghubungkan dari Windows ke mesin VirtualBox dari jarak jauh dengan Ubuntu. Jadi saya perlu mengizinkan port 3306 di iptables:

>iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
sNICkerssss
sumber
1
Bagi saya, saya lupa memverifikasi bind-address di my.cnf. Terima kasih.
abkrim
1
Ini sangat membantu. Terima kasih!
osehgol
1
Bekerja dengan sempurna, tetapi saya menggunakan meja kerja pada windows jadi tidak melakukan langkah 3. tetapi berhasil. Terima kasih!
RohitAneja
Meskipun perintah terakhir tidak bekerja untuk saya, membuat pengguna baru dengan cara Anda menyelesaikan masalah saya. Saya dapat mengakses mysql di raspberry pi dari laptop saya. Terima kasih!
Eyyüp Alkış
ingat untuk FLUSH PRIVILEGESsetelah membuat pengguna baru.
Yew Hong Tat
15

Mengalami masalah ini saat menyiapkan server slave baru. Ditemukan itu adalah alamat IP server slave tidak ada dari server master/etc/hosts.allow file . Menambahkan alamat IP dan membiarkan saya terhubung ke server master.

Perhatikan bahwa saya menggunakan hosts.allowdan hosts.denyuntuk mengontrol akses.

Menandai
sumber
masalah saya dengan konektor / c ++. sekarang, jika saya hanya bisa menemukan apa kebutuhan pengaturan berada di allowsaat denymemiliki ALL: ALL...
ini benar-benar menyelamatkan hidup saya, saya mengalami masalah saat menyambung ke mysql dari workbench, saya perlu menambahkan "ALL: 127.0.0.1" ke file /etc/hosts.allow dan mulai bekerja
Tomáš Tibenský
Dalam kasus saya, / etc / hosts memiliki entri (lama) yang buruk untuk IP host. Ketika mengeluarkan IP baru, itu datang di bawah yang lama dan tampaknya diabaikan. Menghapus IP lama menyembuhkan kesalahan.
David Ramirez
7

Saya punya masalah ini dan akhirnya menjadi admin sys sebelum mengubah port MySQL sedang berjalan. MySQL Workbench berusaha menyambung ke standar 3306 tetapi server berjalan pada 20300.

pengguna3347295
sumber
1
Bagus untuk jawaban ini. Ternyata, saya melakukan ini untuk diri saya sendiri.
hati
5

Masalah pada kasus saya adalah MySQL hanya mengikat ke lo di linux. untuk menyelesaikan masalah saya telah mengedit my.cnf (ditemukan di /etc/mysql/my.cnf) menghapus baris bind-address = 127.0.0.1

ini memungkinkan mysql untuk mengikat ke antarmuka jaringan apa pun

Renato Mendes
sumber
5

Kesalahan ini terjadi pada saya ketika mencoba terhubung ke Google Cloud SQL menggunakan MySQL Workbench 6.3.

Setelah sedikit penelitian saya menemukan bahwa alamat IP saya telah diubah oleh penyedia internet dan dia tidak diizinkan di Cloud SQL.

Saya mengizinkannya dan kembali bekerja.

Paulo Occaso
sumber
4

Saya mengalami kesalahan yang sama persis ketika menghubungkan dari meja kerja MySQL. Begini cara saya memperbaikinya. File konfigurasi /etc/my.cnf saya telah menetapkan nilai bind-address ke alamat IP server. Ini harus dilakukan untuk mengatur replikasi. Bagaimanapun, saya menyelesaikannya dengan melakukan dua hal:

  1. buat pengguna yang dapat digunakan untuk terhubung dari alamat bind di file my.cnf

misalnya

CREATE USER 'username'@'bind-address' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON schemaname.* TO 'username'@'bind-address';
FLUSH PRIVILEGES;
  1. ubah nilai hostname MySQL di detail koneksi di meja kerja MySQL agar sesuai dengan alamat-bind
Tishan
sumber
Terima kasih banyak, kami juga memiliki replikasi MySQL dan bind-address adalah lokal: 10.0.0.x. Saya berjuang selama berhari-hari untuk solusi ini.
iFadi
3

Masalahnya bagi saya adalah bahwa permintaan DNS diblokir oleh FW dalam subnet. Solusinya adalah menonaktifkan pencarian DNS di dalam MySQL.

Bill Grady
sumber
Saya menduga bahwa DNS yang harus disalahkan dalam kasus saya juga.
Zenexer
3

Saya baru mengatur mysql pada kotak windows. Saya mendapat kesalahan OP ketika mencoba terhubung dengan klien Navicat MySql di kotak yang sama. Saya harus menentukan 127.0.0.1 sebagai tuan rumah, dan yang mendapatkannya.

localhost, atau alamat ip aktual server keduanya tidak berfungsi.

Paul B
sumber
3

Kesalahan berarti bahwa itu tidak menerima respons dari port yang diharapkannya menemukan server aktif. Penyebabnya berkisar dari menghubungi mesin yang salah (Untuk salah satu dari sejumlah alasan) hingga server tidak berada di port yang diharapkan.

Periksa port mana yang terikat pada server Anda di /etc/mysql/my.cnf. Apakah itu sesuai dengan apa yang ada dalam pernyataan koneksi Anda. Jika cocok, coba sambungkan dengan mysql dari server itu sendiri dan dari baris perintah mesin tempat Anda menjalankan klien. Jika berfungsi membentuk satu tempat dan bukan tempat lain maka Anda mungkin memiliki masalah konfigurasi firewall / router.

ClearCrescendo
sumber
Saya tidak berpikir ini benar, jika tidak ada yang mendengarkan pada port itu maka Anda akan mendapatkan jawabannya ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61), bukan Lost connection to MySQL serverpesannya.
Ken Williams
2

dalam kasus saya, saya memiliki SEMUA: SEMUA di hosts.deny. Mengubah ini ke ALL: PARANOID memecahkan masalah saya saat menghubungkan melalui ssh

domoarigato
sumber
2

Masalahnya sangat bodoh bagi saya.

Saya biasa mendapatkan masalah yang sama pada mesin AWS EC2 Ubuntu (MariaDB diinstal secara lokal untuk saat ini), jadi saya mencoba membuat SSH tunneling, dan memiliki masalah yang sama. Jadi saya mencoba ssh tunnel over terminal:

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

Dan itu memberitahuku ini:

Silakan masuk sebagai pengguna "ubuntu" daripada "root" pengguna.

Saya mengubah pengguna ssh dari root ke ubuntu, sama seperti konfigurasi ssh saya, dan itu terhubung dengan baik.

Jadi, periksa pengguna yang menghubungkan SSH Anda.

Saya mengawasi ini, jadi ini juga setengah jam dari waktu saya, jadi saya harap ini akan bermanfaat bagi Anda.

Arda
sumber
2

Bagi saya file konfigurasi ditemukan "/etc/mysql/mysql.conf.d/mysqld.cnf" mengomentari alamat bind melakukan trik.

Seperti yang dapat kita lihat di sini: Alih-alih melewatkan jejaring, defaultnya adalah mendengarkan hanya di localhost yang lebih kompatibel dan tidak kalah aman.

scott
sumber
Untuk kejutan terbesar saya, ini bekerja di bawah Debian 10. Saya memberi kesempatan untuk itu dan BEKERJA! Konfigurasi mysql yang diedit sudo nano /etc/mysql/mariadb.conf.d/50-server.cnfdan bukannya bind-address = 111.112.113.114saya gunakan bind-address = 127.0.0.1. Pengaturan terowongan SSH diatur seperti yang dijelaskan pada hostpresto.com/community/tutorials/... Kerja bagus! Terima kasih!
klor
1

Berlari ke masalah yang sama ini, Bind Address bolak-balik tanpa hasil. Solusi bagi saya adalah pembilasan hak istimewa .

mysql> FLUSH PRIVILEGES;
Marko Bajlovic
sumber
1

Bagi saya pengaturan bind-address = 0.0.0.0dimysql/my.cnf bekerja. Itu pada dasarnya mendengarkan semua alamat (tetapi masih satu port) lalu.

Dan jangan lupa restart server Anda: systemctl restart mysql

Jahanzeb Khan
sumber
6
Semua alamat / antarmuka, tetapi hanya satu port tunggal.
Zenexer
1

Saya hanya memiliki masalah yang sama, tetapi dalam kasus saya, saya menyelesaikannya dengan

layanan mysqld mulai

GunSky7
sumber
1

Satu lagi alasan ...

Saya berlari ke server Ubuntu di mana semuanya dikustomisasi dan tidak dapat terhubung karena kesalahan yang sama.

Pengaturan ini ada di dalam /etc/ssh/sshd_config

PermitTunnel no

Setelah berubah menjadi

PermitTunnel yes

Saya dapat terhubung dari jarak jauh ke DB MySQL saya

lewis4u
sumber
1

Saya mencoba menghubungkan wadah docker db saya di Ubuntu 18.04, masalah yang sama.

Pertama periksa perangkat Anda dengan menjalankan nmcli devuntuk memeriksa apakah perangkat docker0terhubung.

Jika tidak terhubung, cobalah untuk me-restart layanan buruh pelabuhan:

sudo service docker restart

Belter
sumber
1

Dalam kasus saya itu adalah port wifi universitas memblokir 3306. Saya dapat terhubung dengan menggunakan hotspot seluler.

Ubah ke hotspot seluler atau jaringan lain, dan jika berfungsi di sana, maka Anda tahu bahwa jaringan asli memblokir port 3306. Jika Anda mendapatkan kesalahan yang sama pada lebih dari 1 jaringan, maka Anda tahu itu khusus untuk mesin Anda.

R Diaz
sumber
1

Firewalldmemblokir alamat IP. jadi untuk memberikan akses, gunakan perintah ini:

firewall-cmd --permanent --zone = dipercaya --add-source = YOUR_IP / 32

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

firewall-cmd --muat ulang

Rodniko
sumber
0

Saat menghubungkan ke Mysql dari jarak jauh, saya mendapatkan kesalahan. Saya memiliki peringatan ini di /var/log/mysqld.log:

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

Saya baru saja menambahkan baris ini ke /etc/hostsfile:

X.X.X.X some_name

Masalah terpecahkan! Tidak menggunakan skip-name-resolvemenyebabkan beberapa kesalahan pada aplikasi lokal saya saat menghubungkan ke MySQL.

Amin Sh
sumber
0

Saya memiliki masalah yang sama. Untuk memperbaikinya saya baru saja mengubah host dari localhost: 3306 menjadi hanya localhost. Jadi kesalahan dapat terjadi ketika Anda memisahkan port yang tidak tepat untuk koneksi. Lebih baik membiarkannya sebagai default.

Barto
sumber
1
Ini mungkin karena mysql tidak menerima port sebagai bagian dari hostname, alih-alih Anda perlu menggunakan argumen-P 3306
Clay H
0

Izin baca-tulis direktori database juga masalah yang saya temukan. Pastikan aplikasi Anda dapat menemukan file di lokasi db. Coba chmod 777 untuk pengujian.

Abbas
sumber
0

Saya menghadapi masalah yang sama. Saya memeriksa dan mencoba untuk mengatur AllowTcpForwarding Ya tetapi itu hilang di sshd_config saya jadi tidak ada bantuan. Saya tidak mengubah sshd_config atau my.cnf. Pastikan nama host ssh TIDAK sama dengan nama host mysql (gunakan localhost).

Di meja kerja, pilih + untuk menambahkan koneksi baru dan atur yang berikut:

  • metode koneksi: standar TCP / IP melalui SSH
  • Nama Host SSH: 192.168.0.50:22 (ganti IP dan port server SSH jarak jauh (opsional))
  • Nama Pengguna SSH: sshuser
  • Anda dapat mengatur kata sandi atau menambahkan saat diminta
  • Nama Host MYSQL: localhost atau 127.0.0.1
  • Port MYSQL Server: 3306
  • Anda dapat mengatur kata sandi atau menambahkan saat diminta

Tes koneksi. Itu harus berhasil kemudian tekan OK.Viola!

Reagan Ochora
sumber
0

Jika bind-address tidak ada dalam file konfigurasi Anda dan mysql di-host pada AWS, silakan periksa grup keamanan Anda. Dalam kondisi ideal, aturan masuk harus menerima semua koneksi dari port 3306 dan aturan keluar harus merespons kembali ke semua IP yang valid.

Aman Bansal
sumber
0

Saya telah melakukan di bawah 3 langkah kemudian bekerja untuk saya.

  1. bind-address = "YOUR MACHINE IP"dalam my.cnffile di /etc/my.cnf

  2. Mulai ulang layanan dengan perintah: service httpd restart

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

Kamal Oberoi
sumber
0

Saya memiliki kesalahan yang sama (menghubungkan ke MYSQL pada aws melalui MYSql Workbench). Saya digunakan untuk menghubungkan baik-baik saja sebelumnya dan tiba-tiba berhenti berfungsi dan tidak akan berfungsi lagi). Koneksi saya melalui SSH dilindungi oleh keyfile.

Ternyata saya kehabisan waktu. Jadi saya meningkatkan batas waktu koneksi SQL menjadi 30 detik (dari standar 10) dan bagus untuk kembali. hal-hal untuk dicoba (jika Anda berada dalam pengaturan serupa)

  1. Bisakah Anda ssh langsung dari terminal ke server (mendeteksi masalah dengan izin file kunci, dll)?
  2. Bisakah Anda kemudian melalui terminal terhubung ke MySQL dengan pengguna / pwd yang sama menggunakan sesuatu seperti mysql -u [username] -p [database]? Ini akan memeriksa masalah hak pengguna dll.
  3. jika keduanya berfungsi maka parameter Anda bukan masalah dan mungkin masalah batas waktu yang sama seperti saya (kecuali tidak pernah mengatakan kesalahan batas waktu, tetapi diminta untuk memeriksa izin dll)
Burges K
sumber
0

Ruang disk yang terbatas dapat menyebabkan kesalahan ini.

Periksa ruang disk Anda

$ df -h

Cobalah menambah ruang jika ada 100% disk yang digunakan.

Dalam kasus saya: Saya memiliki kotak Vagrant (8.0.1) (Ubuntu 16.04) Kapasitas disk mysql saya adalah 10GB, saya meningkatkannya menjadi 20GB

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

Kemudian restart mysql

$ sudo service mysql restart
Sadee
sumber
0

Jika Anda menghadapi erorr yang terhubung dari jarak jauh, buka opsi mysql jarak jauh di cpanel dan kemudian tambahkan% di Host (% wildcard diizinkan).

John
sumber