166

I am getting error:

"Lost connection to MySQL server at 'reading initial communication packet, system error: 0"

while I am going to connect my db.

If I am using localhost everything is working fine. But when I am using my live IP address like below, it's getting error:

mysql_connect("202.131.xxx.106:xxxx", "xxxx", "xxxxx") or die(mysql_error());
ROMANIA_engineer
  • 54,432
  • 29
  • 203
  • 199
Rikesh
  • 26,156
  • 14
  • 79
  • 87

42 Answers42

127

Someone here suggests that it might be a firewall problem:

I have just had this problem and found it was my firewall. I use PCTools Firewall Plus and it wasn't allowing full access to MySQL. Once I changed that it was fine.

Could that be it?

Also, someone here suggests that it might be because the MySQL server is bound to the loop-back IP (127.0.0.1 / localhost) which effectively cuts you off from connecting from "outside".

If this is the case, you need to upload the script to the webserver (which is probably also running the MySQL server) and keep your server host as 'localhost'

starball
  • 20,030
  • 7
  • 43
  • 238
Thomas Daugaard
  • 1,569
  • 1
  • 15
  • 14
  • 10
    what do you mean localhost? I am also facing the same problem and using localhost only also. Application is on the same machine as the database. What did you mean localhost? – oneofakind Apr 06 '15 at 01:56
  • 7
    @oneofakind He means to connect to 'localhost" instead of '127.0.0.1' – Alexander Holsgrove Oct 30 '15 at 11:04
  • 2
    I had the same problem on OSX with mamp pro. I fixed it by disabling/re-enabling the "allow network access to mysql" checkbox on the mamp pro mysql tab. – Ousmane Dec 27 '17 at 15:33
  • Another reason for this error would be using a MySQL client to connect to a non MySQL db (like PostgreSQL). – roychri Dec 21 '22 at 19:15
49
  1. Allow remote connect to MySQL.
    Edit file:

    >sudo nano /etc/mysql/my.cnf
    

    Comment line:

    #bind-address        = 127.0.0.1
    

    Restart MySQL:

    >sudo service mysql restart
    
  2. Create user for remote connection.

    >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. In my case I need to connect remotely from Windows to VirtualBox machine with Ubuntu. So I need to allow port 3306 in iptables:

    >iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
    
7ochem
  • 2,183
  • 1
  • 34
  • 42
sNICkerssss
  • 6,312
  • 1
  • 24
  • 16
49

Open mysql configuration file named my.cnf and try to find "bind-address", here replace the setting (127.0.0.1 OR localhost) with your live server ip (the ip you are using in mysql_connect function)

This will solve the problem definitely.

7ochem
  • 2,183
  • 1
  • 34
  • 42
intekhab rizvi
  • 499
  • 4
  • 2
  • 2
    Make sure you use bind-address = 127.0.0.1 or localhost when using ssh tunnel. Had this problem with bitnami, where bind-address was machine ip. – z2z Jan 03 '19 at 11:25
  • 1
    The same problem and solution for Debian 10 + MySQL standalone dedicated server. – Vilq Jan 27 '20 at 17:04
  • It should be mentioned that it might be generally preferrable to bind the mysql service to `127.0.0.1` where applicable so direct access from other hosts is not possible. This prevents remote brute force attacks and does not expose possible security issues to the network. If your application is located on the same machine (which is a very common hosting setup), use `127.0.0.1` resp. `localhost` as mysql host and it will work the same way as binding the service to your external interface and using that as mysql host. If your application is located elsewhere use an internal network if possible. – David Apr 20 '20 at 19:16
  • Trust in this guy, I have a team of people here that were doubtful, but this does *definitely solve the problem definitely*. – John Hunt Feb 10 '22 at 17:16
17

Had this problem when setting up a new slave server. Found it was the slave server IP address was missing from the master server /etc/hosts.allow file. Added the IP address and it let me connect to the master server.

Note that I use hosts.allow and hosts.deny to control access.

Marko
  • 20,385
  • 13
  • 48
  • 64
Mark
  • 171
  • 1
  • 2
  • my problem with connector/c++. now, if i could only find what setting needs to be in `allow` when `deny` has `ALL: ALL`... –  Jul 08 '13 at 23:30
  • this really saved my live, I was having issues connecting to mysql from workbench, I needed to add "ALL: 127.0.0.1" to /etc/hosts.allow file and it started to work – Tomáš Tibenský May 30 '14 at 06:58
  • In my case, /etc/hosts had a bad (old) entry for the host IP. When issued a new IP, it came under the old one and was seemingly ignored. Deleting the old IP healed the error. – David Ramirez Nov 12 '15 at 22:44
9

I had this problem and it ended up being the prior sys admin changed the port MySQL was running on. MySQL Workbench was trying to connect to the default 3306 but the server was running on 20300.

user3347295
  • 91
  • 1
  • 1
7

The error means that it didn't receive a response from the port it expected to find the server on. The causes range from contacting the wrong machine (For one of a number of reasons) to the server not being on the expected port.

Check which port your server is bound to in /etc/mysql/my.cnf. Does that correspond to what is in your connect statement. If they match then try connecting with mysql from the server itself and from the command line of the machine where you are running the client. If it works form one place and not another then you may have a firewall / router configuration issue.

ClearCrescendo
  • 1,145
  • 11
  • 22
  • I don't think this is correct, if there's nothing listening on that port then you'll get the response `ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)`, not the `Lost connection to MySQL server` message. – Ken Williams Oct 12 '19 at 02:12
6

One more reason...

I ran into an Ubuntu server where everything was customized and could not connect because of that same error.

This setting was inside /etc/ssh/sshd_config

PermitTunnel no

After turning into

PermitTunnel yes

I was able to connect remotely to my MySQL DB

lewis4u
  • 14,256
  • 18
  • 107
  • 148
5

The problem on my case was MySQL being bind only to the lo on linux. in order to solve the problem i have edited the my.cnf (found at /etc/mysql/my.cnf) removing the line bind-address=127.0.0.1

this allows mysql to bind to any network interface

Renato Mendes
  • 68
  • 1
  • 7
5

I just set up mysql on a windows box. I got the OP's error when trying to connect with the Navicat MySql client on the same box. I had to specify 127.0.0.1 as the host, and that got it.

localhost, or the servers actual ip address both did not work.

Paul B
  • 51
  • 1
  • 1
5

This error occurred to me while trying to connect to the Google Cloud SQL using MySQL Workbench 6.3.

After a little research I found that my IP address has been changed by the internet provider and he was not allowed in the Cloud SQL.

I authorized it and went back to work.

Paulo Occaso
  • 51
  • 1
  • 2
4

I ran into this exact same error when connecting from MySQL workbench. Here's how I fixed it. My /etc/my.cnf configuration file had the bind-address value set to the server's IP address. This had to be done to setup replication. Anyway, I solved it by doing two things:

  1. create a user that can be used to connect from the bind address in the my.cnf file

e.g.

CREATE USER 'username'@'bind-address' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON schemaname.* TO 'username'@'bind-address';
FLUSH PRIVILEGES;
  1. change the MySQL hostname value in the connection details in MySQL workbench to match the bind-address
rjdkolb
  • 10,377
  • 11
  • 69
  • 89
Tishan
  • 141
  • 1
  • 5
  • Thank you very much, we had also MySQL replication and the bind-address was a local one: 10.0.0.x. I was struggling for days for this solution. – iFadi Feb 05 '20 at 09:42
4

I faced the same problem. I checked and tried to set AllowTcpForwarding Yes but it was missing in my sshd_config so no help.I didn't change sshd_config or my.cnf. Make sure the ssh hostname is NOT the same with the mysql hostname(use localhost).

In workbench, choose + to add new connection and set the following:

  • connection method: standard TCP/IP over SSH
  • SSH Hostname: 192.168.0.50:22 (replace remote SSH server IP and port(optional))
  • SSH Username: sshuser
  • You can set password or add at the prompt
  • MYSQL Hostname: localhost or 127.0.0.1
  • MYSQL Server port:3306
  • You can set password or add at the prompt

Test connection. It should be successful then hit OK.Viola!

Reagan Ochora
  • 1,642
  • 1
  • 19
  • 22
  • Thank you so much, the mysql host name was my hang up. It makes perfect sense now though. – Nick Aug 24 '22 at 21:47
3

The problem for me was that DNS queries were blocked by the FW within the subnet. The solution was to disable DNS lookups within MySQL.

Bill Grady
  • 41
  • 1
3

The problem was quite stupid for me.

I used to get the same issue on AWS EC2 Ubuntu machine (MariaDB is installed locally for the time being), so I tried to make SSH tunneling, and had the same issue. So I tried to ssh tunnel over terminal:

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

And it told me this:

Please login as the user "ubuntu" rather than the user "root".

I changed ssh user from root to ubuntu, just like my ssh config, and it connected just fine.

So check your SSH connecting user.

I oversaw this, so this too half an hour of my time, so I hope this will be useful for you.

Arda
  • 6,756
  • 3
  • 47
  • 67
3

For me the config file was found "/etc/mysql/mysql.conf.d/mysqld.cnf" commenting out bind address did the trick.

As we can see here: Instead of skip-networking the default is now to listen only on localhost which is more compatible and is not less secure.

scott
  • 1,531
  • 2
  • 16
  • 29
  • For my biggest surprise, this one worked under Debian 10. I gave a chance for it and WORKS! Edited mysql config `sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf`and instead of `bind-address = 111.112.113.114` I used `bind-address = 127.0.0.1`. The SSH tunnel settings are set as described on https://hostpresto.com/community/tutorials/how-to-connect-to-a-remote-mysql-server-via-an-ssh-tunnel/ Good job! Thanks! – klor Jul 17 '19 at 18:07
3

I am trying to connect my db docker container on Ubuntu 18.04, same problem.

First check your device by run nmcli dev to check if device docker0 is connected.

If it is not connected, try to restart docker service:

sudo service docker restart

Belter
  • 3,573
  • 5
  • 42
  • 58
3

I tried make a telnet over remote server on port 3306. The error message is clear

Host 'x.x.x.x' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connection closed by foreign host.

As root at server mysqladmin flush-hosts worked at all!

Moesio
  • 3,100
  • 1
  • 27
  • 36
3

I had the same error when using localhost. I restarted the MySQL service and it worked fine.

geertjanvdk
  • 3,440
  • 24
  • 26
  • 1
    Apparently in my case, it took a lot of time for the image to initialize the database, and that's why I couldn't connect for quite a while. – Param Siddharth Aug 22 '21 at 12:10
2

in my case, I had ALL: ALL in hosts.deny. Changing this to ALL: PARANOID solved my problem when connecting over ssh

domoarigato
  • 2,802
  • 4
  • 24
  • 41
2

Ran into this same issue, Bind Address back and forth to no avail. Solution for me was flushing privileges.

mysql> FLUSH PRIVILEGES;
Marko Bajlovic
  • 323
  • 5
  • 12
2

Firewalld blocks the IP address. so to give access, use these commands:

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

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

firewall-cmd --reload

AbsoluteƵERØ
  • 7,816
  • 2
  • 24
  • 35
Rodniko
  • 4,926
  • 20
  • 69
  • 93
1

For me setting bind-address = 0.0.0.0 in mysql/my.cnf worked. It basically listens to all addresses (but still one port) then.

And don't forget restart your server: systemctl restart mysql

Jahanzeb Khan
  • 440
  • 4
  • 17
1

I have done below 3 steps then working for me.

  1. bind-address = "YOUR MACHINE IP" in my.cnf file at /etc/my.cnf

  2. Restart service by command : service mysql restart

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

JoSSte
  • 2,953
  • 6
  • 34
  • 54
Kamal Oberoi
  • 165
  • 1
  • 1
  • 9
1

I just had the same problem, but in my case I solved it with

service mysqld start

GunSky7
  • 25
  • 8
1

In my case it was the university wifi blocking port 3306. I was able to connect by using a mobile hotspot.

Change to a mobile hotspot or another network, and if it works there, then you know that original network is blocking port 3306. If you get the same error on more than 1 network, then you know it's specific to your machine.

R Diaz
  • 22
  • 4
1
  • I had port 3306 in Docker container but in Dockerfile it was 33060. I edited the port in Docker container to 33060

  • Must have been added to the Dockerfile

    ENV MYSQL_ROOT_HOST 172.17.0.1

1

I had the same issue installing MySQL docker image then trying to connect from WSL2 MySQL client.

As it was stated in the accepted answer that it should be a firewall issue, in my case this error was caused due to not allowing docker for windows to communicate to private network.

I changed the settings on "Firewall & network protection", "allow an app through firewall", "change settings" (need administrator rights) and allowed "Docker desktop backend" to connect to private network.

balq
  • 21
  • 4
1

I had the same error on my Mac with a local MySQL installation. The problem was that the number files that MySQL was opening was too high for MacOS.

To see if you have the same problem you can run this command and look for File Descriptor errors:

tail -200 /usr/local/var/mysql/$(whoami).err | grep "Warning"

I added this line to my.cnf file and the problem was fixed:

table_open_cache = 200
Huseyin Yagli
  • 9,896
  • 6
  • 41
  • 50
1

Had the same problem, what worked for me was:

  1. Go to Windows Firewall where you allow applications.
  2. mysql probably won't be in the list, so you need to add it, its path is typically C:/Program Files (x86)/MySQL/bin/mysql
  3. Mark both private and public networks, apply.
UberStreuneR
  • 57
  • 2
  • 6
0

When connecting to Mysql remotely, I got the error. I had this warning in /var/log/mysqld.log:

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

I just added this line to /etc/hosts file:

X.X.X.X some_name

Problem solved! Not using skip-name-resolve caused some errors in my local app when connecting to MySQL.

Laurel
  • 5,965
  • 14
  • 31
  • 57
Amin Sh
  • 2,684
  • 2
  • 27
  • 42
0

I had identical problem. To fix it I just changed host from localhost:3306 to just localhost. So error may acour when You sepcify unproper port for connection. It's better to leave it default.

Barto
  • 469
  • 1
  • 6
  • 15
  • 2
    This is likely because mysql doesn't accept the port as part of the hostname, instead you need to use the argument `-P 3306` – Clay H Jun 27 '17 at 13:48
0

If bind-address is not present in your configuration file and mysql is hosted on AWS instance, please check your security group. In ideal conditions, the inbound rules should accept all connection from port 3306 and outbound rule should respond back to all valid IPs.

0

I had a similar error (connecting to MYSQL on aws via MYSql Workbench). I used to connect fine before and all of a sudden it stopped working and just wouldn't work again). My connection was via SSH protected by keyfile.

Turns out I was timing out. So I increased the SQL connection timeout to 30 secs (from default 10) and was good to go again. things to try (if you're in a similar setup)

  1. Can you ssh directly from terminal to the server (detects issues with key file permissions etc)?
  2. Can you then through terminal connect to MySQL with the same user/pwd using something like mysql -u [username] -p [database]? This will check for user rights issues etc.
  3. if both of those work then your parameters are not the problem and maybe same timeout issue like me (except it never said timeout error, but rather asked to check for permissions etc)
piet.t
  • 11,718
  • 21
  • 43
  • 52
0

Limited disk space can cause to this error.

Check your disk space

$ df -h

Try to increase the space if there are 100% used disks.

In my case: I have Vagrant (8.0.1) box (Ubuntu 16.04) My mysql disk capacity was 10GB, I increased it to 20GB

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

Then restart mysql

$ sudo service mysql restart
Sadee
  • 3,010
  • 35
  • 36
0

If you face this erorr connecting from remote, go to remote mysql option in cpanel and then add % in Host (% wildcard is allowed) .

Nur Uddin
  • 1,798
  • 1
  • 28
  • 38
0

I had this problem connecting to my MySQL server via a proxy server. In my case it was working fine the week prior, and I didn't make any changes to my connection or server settings.

On a hunch, I decided to SSH into the proxy server to see if it was still working, and as soon as I did I was prompted to update my UNIX password, because it had expired. Resetting the password allowed me to connect again via the proxy.

The Unknown Dev
  • 3,039
  • 4
  • 27
  • 39
0

I gets this error when I use docker in M1: the problem for me is that the docker container exits once it is launched. When I use docker network ls and it does not show the container in the network. Thus, rebuilding a container that is active solves my problem.

htlbydgod
  • 330
  • 2
  • 8
0

I met this error in the past, and the reason was a bit trivial, the main reason is that I had used Postger before I used mysql, and the postage port was different from the port of mysql. I hope that they can take advantage of the error that happened to me before using any other solution, I must check the port

'PORT': '3306',

  DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': <Database_name>,
            'USER':'root',
            'PASSWORD':'',
            'HOST':'localhost',
            'PORT': '3306',
        }
    }
CodeView
  • 498
  • 3
  • 14
0

What worked for me was the following:

Opened my my.cnf file and added

innodb_file_per_table = OFF

And, here are the advantages and disadvantages of disabling this file-per-table configuration.

Salo Charabati
  • 147
  • 1
  • 2
  • 12
0

It was a temporary issue in my case. I use a external cloud provider that may have closed the door for a few minutes. It could well have been a quick internet connection issue. It is worth repeating after 5-10 min.

Al Martins
  • 431
  • 5
  • 13
0

I was using mydumper to connect and my problem was I specified --ssl only my local mysql server isn't set up for that. Removing it fixed the problem.

My specific error (from the log) was mydumper Lost connection to MySQL server at 'reading initial communication packet', system error: 54.

Connecting via mysql command line with the same user/pass/host/tcp-protocol worked fine. (used root user)

Curtis Yallop
  • 6,696
  • 3
  • 46
  • 36
-1

Database directory read-write permission also a problem i found. Just make sure your application is able to rw files on db location. Try chmod 777 for testing.

Abbas
  • 552
  • 5
  • 8