title: ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 54
body: <p>So I created a $5 droplet ubuntu-based and installed mysql via</p>
  
  <pre><code>sudo apt-get install mysql-server
  </code></pre>
  
  <p>Then I ran the sudo <code>mysql_secure_installation</code> didn't change the password and hit enter to all the other questions.</p>
  
  <p>and then followed the "Configure MySQL to Allow Remote Access" section instructions.</p>
  
  <p>My <code>/etc/mysql/my.cnf</code> looks like this now:</p>
  
  <pre><code>#
  # The MySQL database server configuration file.
  #
  # You can copy this to one of:
  # - "/etc/mysql/my.cnf" to set global options,
  # - "~/.my.cnf" to set user-specific options.
  #
  # One can use all long options that the program supports.
  # Run program with --help to get a list of available options and with
  # --print-defaults to see which it would actually understand and use.
  #
  # For explanations see
  # http://dev.mysql.com/doc/mysql/en/server-system-variables.html
  
  # This will be passed to all mysql clients
  # It has been reported that passwords should be enclosed with ticks/quotes
  # escpecially if they contain "#" chars...
  # Remember to edit /etc/mysql/debian.cnf when changing the socket location.
  [client]
  port            = 3306
  socket          = /var/run/mysqld/mysqld.sock
  
  # Here is entries for some specific programs
  # The following values assume you have at least 32M ram
  
  # This was formally known as [safe_mysqld]. Both versions are currently parsed.
  [mysqld_safe]
  socket          = /var/run/mysqld/mysqld.sock
  nice            = 0
  [mysqld]
  #
  # * Basic Settings
  #
  user            = mysql
  pid-file        = /var/run/mysqld/mysqld.pid
  socket          = /var/run/mysqld/mysqld.sock
  port            = 3306
  basedir         = /usr
  datadir         = /var/lib/mysql
  tmpdir          = /tmp
  lc-messages-dir = /usr/share/mysql
  #skip-external-locking
  skip-name-resolve
  #skip-networking
  #
  # Instead of skip-networking the default is now to listen only on
  # localhost which is more compatible and is not less secure.
  bind-address            = &lt;MY_DROPPLET_IP&gt;
  connect_timeout = 100
  # * Fine Tuning
  #
  key_buffer              = 16M
  max_allowed_packet      = 16M
  thread_stack            = 192K
  thread_cache_size       = 8
  # This replaces the startup script and checks MyISAM tables if needed
  # the first time they are touched
  myisam-recover         = BACKUP
  #max_connections        = 100
  #table_cache            = 64
  #thread_concurrency     = 10
  #
  # * Query Cache Configuration
  #
  query_cache_limit       = 1M
  query_cache_size        = 16M
  #       
  # * Logging and Replication
  #
  # Both location gets rotated by the cronjob.
  # Be aware that this log type is a performance killer.
  # As of 5.1 you can enable the log at runtime!
  #general_log_file        = /var/log/mysql/mysql.log
  #general_log             = 1
  #
  # Error log - should be very few entries.
  #
  log_error = /var/log/mysql/error.log
  #
  # Here you can see queries with especially long duration
  #log_slow_queries       = /var/log/mysql/mysql-slow.log
  #long_query_time = 2
  #log-queries-not-using-indexes
  #
  # The following can be used as easy to replay backup logs or for replication.
  # note: if you are setting up a replication slave, see README.Debian about
  #       other settings you may need to change.
  #server-id              = 1
  #log_bin                        = /var/log/mysql/mysql-bin.log
  expire_logs_days        = 10
  max_binlog_size         = 100M
  #binlog_do_db           = include_database_name
  #binlog_ignore_db       = include_database_name
  #
  # * InnoDB
  #
  # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
  # Read the manual for more InnoDB related options. There are many!
  #
  # * Security Features
  #
  # Read the manual, too, if you want chroot!
  # chroot = /var/lib/mysql/
  #
  # For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
  #
  # ssl-ca=/etc/mysql/cacert.pem
  # ssl-cert=/etc/mysql/server-cert.pem
  # ssl-key=/etc/mysql/server-key.pem
  Then I might have configured something for port 3306 and ip-tables but can't remember what i tis (found on this community as well)
  </code></pre>
  
  <p>However I cannot connect from my computer to the remote database :( because I get the error on the title, I've googled the hell out of it and seems like Im the only person in the world getting the system error: 54 thing.</p>
  
  <p>This is mysql version:
  mysql Ver 14.14 Distrib 5.5.47, for debian-linux-gnu (x86_64) using readline 6.3</p>
  
  <p>I've also granted full permissions to the root user and some other users (to test)</p>
  
  <p>doing this:</p>
  
  <pre><code>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'r00t' WITH GRANT OPTION;
  </code></pre>
  
  <p>and in a naive attempt, I ran the following commands to "open port 3306":</p>
  
  <pre><code>iptables -A INPUT -p tcp -s 0/0 --sport 1024:65535 -d &lt;serverip&gt; --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
  iptables -A OUTPUT -p tcp -s &lt;serverip&gt; --sport 3306 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
  </code></pre>
  
  <p>however I still get this error from hell.... :C</p>
  
  <p>also tried to telnet the server and this was what happened:</p>
  
  <pre><code>$ echo X | telnet -e X 45.58.41.103 3306
  </code></pre>
  
  <p>resulting in:</p>
  
  <pre><code>Telnet escape character is 'X'.
  Trying &lt;ip&gt;...
  Connected to &lt;ip&gt;
  Escape character is 'X'.
  </code></pre>
  
  <p>And now I want to cry :C</p>
  
  <p>I just want to connect to the server via MySQL workbench and deploy the database in a remote server strictly for testing temporary purposes (security is not an issue here).</p>