How to Solve Error Message ERROR 2013 (HY000): Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0

Posted on

Introduction

The error described in the title of this article is quite unique. Several attempts on solving the problem exist in other articles in the web. But in the context of this article, there is a specific condition that is quite unique so in the end it cause the error occurs. The error occurs with the specific error message. That error message is in the following output message :

root@hostname ~# mysql -uroot -p -h 127.0.0.1 -P 4406
Enter password: 
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
root@hostname ~#

The above error message is a consequence of connecting to a MySQL Database Server. It is actually a regular MySQL Database Server running in a machine. But the connection itself is a different one. The connection exist using docker container running process. Below is the actual running process of that docker container :

root@hostname ~# netstat -tulpn | grep 4406
tcp6       0      0 :::4406                 :::*                    LISTEN      31814/docker-proxy  
root@hostname ~#

There are already lots of article discuss abot this error. For an example in this link in the stackoverflow or in this link , and another one in this link , furthermore in this link . The general problem is actually the same. There is something wrong in the running process of the normal MySQL Database Server.

Step for solving the problem

There are several steps for solving the problem above. There are two parts for solving the problem. The first part is for detecting the root cause of the problem. Later on, the second part is the actual solution taken for solving the root cause of that problem. So, the following section which is the first part will focus on trying to search for the cause of the problem.

 

Searching the cause of the problem

In the case of this article, the following is the steps for solving the error :

1. Check whether the MySQL Database Server process is actually running. Execute it as follows using any command pattern available in the operating for checking a running process. In the context of this article, it is ‘systemctl status mysql’. So, the following is an example for the execution of the command pattern :

root@hostname ~# systemctl status mysql
● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; bad; vendor preset: enabled)
   Active: active (running) since Mon 2019-09-16 13:16:12; 40s ago
  Process: 14867 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
  Process: 14804 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 14869 (mysqld)
    Tasks: 31 (limit: 4915)
   CGroup: /system.slice/mysql.service
           └─14869 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
...
root@hostname ~#

2. Before connecting to MySQL Database Server using a different port listening to any incoming requests where it is a docker container process handling, just test the normal connection. In other words, connect using the normal port listening in the machine for any incoming connection to MySQL Database Server. Normally, it exists in port ‘3306’. Do it as follows :

root@hostname ~# mysql -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
root@hostname ~# 

The above error message is where the actual root problem is. Check for the actual file which is representing the socket file for mysql daemon process as follows :

root@hostname ~# cd /var/run/mysqld/
root@hostname ~# ls
mysqld.pid  mysql.sock  mysql.sock.lock
root@hostname ~#

Apparently, according to the above output, the file doesn’t exist. That is why the connection to MySQL Database Server is always failed. Eventhough the connection process is done through the default port of ‘3306’.

3. Try to restart the process and hope that it will solve the problem.

root@hostname ~# systemctl stop mysql
root@hostname ~# systemctl start mysql
root@hostname ~# mysql -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
root@hostname ~#

4. Unfortunately, the above process also ends in failure. Continue on the step for solving the problem, just check the MySQL Database configuration file. After checking the file configuration, apparently, it doesn’t fit at all. Eventually, spending hours for changing the configuration files, nothing happens.

For the cause happens above, check the correct configuration before to see which MySQL Database Server configuration used by the running MySQL Database Server.

 

Checking the MySQL Database Server configuration used by the running MySQL Database Server

In the previous section or part, there is a need to search for the actual configuration file used by the running MySQL Database Server. It is just to make sure that the configuration file used is the correct one. So, every change can bring the right impact on solving the error problem. Below is the step for searching for it :

1. Check the list of the service first by referring to the running process. In the previous part, the running process is the ‘mysql’ one. Execute the following command pattern to list the available running process :

systemctl list-unit-files | grep mysql

The output of the above command pattern for an example is in the following one :

user@hostname:~$ systemctl list-unit-files | grep mysql
mysql.service                                                    bad            
mysqld.service                                                   bad            
user@hostname:~$ 

2. Next, check the content of the service by executing the following command. Choose the correct service, in this context, it is ‘mysql.service’ :

user@hostname:~$ systemctl cat mysql.service
# /lib/systemd/system/mysql.service
# MySQL systemd service file
[Unit]
Description=MySQL Community Server
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=forking
User=mysql
Group=mysql
PIDFile=/run/mysqld/mysqld.pid
PermissionsStartOnly=true
ExecStartPre=/usr/share/mysql/mysql-systemd-start pre
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
TimeoutSec=600
Restart=on-failure
RuntimeDirectory=mysqld
RuntimeDirectoryMode=755
LimitNOFILE=5000
user@hostname:~$

3. Apparently, the file responsible for starting the service is in the file ‘/usr/share/mysql/mysql-systemd-start’ according to the output message above. The following is the content of that file which is only part of it :

...
  if [ ! -r /etc/mysql/my.cnf ]; then
    echo "MySQL configuration not found at /etc/mysql/my.cnf. Please create one."
    exit 1
  fi
...

4. After checking the content of the file ‘/etc/mysql/my.cnf’, apparently it is not the correct file. So, in order to be more accurate, there are another way to find out the configuration file used by the running MySQL Database Server. The reference or the information exist in this link. So, according to the information in that link, just execute the following command pattern to get the right one. It is for getting the process ID and also the right MySQL Database Server running process :

root@hostname ~# netstat -tulpn | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      21192/mysqld        
root@hostname ~# ps aux | grep 21192
root@hostname ~# ps aux | grep 21192
mysql    21192  0.2  0.1 3031128 22664 ?       Sl   Sep16   1:39 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
root     25442  0.0  0.0  23960  1068 pts/20   S+   01:41   0:00 grep 21192
root@hostname ~#

After getting the right running process, do the following command of ‘strace file_name_process’ :

root@hostname ~# cd /usr/sbin/
root@hostname ~# strace ./mysqld 

The following is part of the output of the command :

stat("/etc/my.cnf", 0x7fff2e917880)     = -1 ENOENT (No such file or directory)
stat("/etc/mysql/my.cnf", {st_mode=S_IFREG|0644, st_size=839, ...}) = 0
openat(AT_FDCWD, "/etc/mysql/my.cnf", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=839, ...}) = 0
brk(0x35f6000)                          = 0x35f6000
read(3, "#\n# The MySQL database server co"..., 4096) = 839
openat(AT_FDCWD, "/etc/mysql/conf.d/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 4
fstat(4, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
getdents(4, /* 4 entries */, 32768)     = 120
getdents(4, /* 0 entries */, 32768)     = 0
close(4)                                = 0
stat("/etc/mysql/conf.d/mysql.cnf", {st_mode=S_IFREG|0644, st_size=629, ...}) = 0
openat(AT_FDCWD, "/etc/mysql/conf.d/mysql.cnf", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=629, ...}) = 0
read(4, "[mysqld]\n\n# Connection and Threa"..., 4096) = 629
read(4, "", 4096)                       = 0
close(4)                                = 0
stat("/etc/mysql/conf.d/mysqldump.cnf", {st_mode=S_IFREG|0644, st_size=55, ...}) = 0
openat(AT_FDCWD, "/etc/mysql/conf.d/mysqldump.cnf", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=55, ...}) = 0
read(4, "[mysqldump]\nquick\nquote-names\nma"..., 4096) = 55
read(4, "", 4096)                       = 0
close(4)                                = 0
read(3, "", 4096)                       = 0
close(3)                                = 0
stat("/root/.my.cnf", 0x7fff2e917880)   = -1 ENOENT (No such file or directory)

The correct one is eventually in ‘/etc/mysql/conf.d/mysql.cnf’. After checking the content of the file, it is actually an empty file. This is the main cause of it. There has been some update and reverse install version of the MySQL Database Server, it causing some mess to the MySQL Database Server. The solution is just to fill that empty configuration file with the correct configuration. The reference for the correct configuration of MySQL Database Server exist in this link. Restart the MySQL Server again, the above error problem will be solved.

One thought on “How to Solve Error Message ERROR 2013 (HY000): Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0

Leave a Reply