Unable to Connect to Any of The Specified MySQL Hosts Error

I have an application that requires my users to connect to an online MySQL database through “remote access” from ANY IP address (the IP address from their own internet network) so that it confirms they are in the database prior to accessing the software.

I have tried to run command lines in my Linux terminal to allow ALL users to connect remotely from any ip address using the following command:

`GRANT ALL ON database_name.* TO root@'%' IDENTIFIED BY 'user_password';`

I have configured my MySQL database server configuration file to enable proper remote connection (I believe).

My “MySQL database server configuration file” located in /etc/mysql/mysql.conf.d/mysqld.cnf looks like the following below:

  #
    # 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.
    
    # Here is entries for some specific programs
    # The following values assume you have at least 32M ram
    
    [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
    #
    # Instead of skip-networking the default is now to listen only on
    # localhost which is more compatible and is not less secure.
    bind-address		= 0.0.0.0
    #require_secure_transport = on
    #
    # * Fine Tuning
    #
    key_buffer_size		= 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-options  = BACKUP
    #max_connections        = 100
    #table_open_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
    #slow_query_log		= 1
    #slow_query_log_file	= /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

I have also tried to unblock the FireWall to enable tcp connection using the following command line:

`sudo ufw allow 3306/tcp`

My connection string from my desktop application looks like this:

`MysqlConn.ConnectionString = "server=MyServerIPaddress;Port=3306;database=MyDatabaseName;Uid=root;Pwd=MyPassword;Connect Timeout=30;SslMode=none;"`

My users still get the “Unable to connect to any of the specified mysql hosts.” error message.
Any support is appreciated.

GRANT ALL ON database_name.* TO root@'%' IDENTIFIED BY 'user_password';

This doesn’t allow all users to connect to MySQL from any host. This allows the root user to connect to MySQL from any host (which is not a real good idea, but that aside).

As far as I know there is no way to allow any user to connect to MySQL. You have to create users for them.

so let’s start with the basics. Your error message indicates the problem is in your networking, not internal to mysql.

netstat -pan | grep 3306

Make sure mysql is bound to your outbound ports. You should get a response from this command that looks something like

tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN <PID>/mysqld

If you DON’T get that, mysql hasn’t been able to bind itself to the port it needs to. Find out why.

If it IS there;
ping 192.168.1.1 (replace this with your gateway IP)
ping google.com

Make sure you’re getting a route/DNS to the internet and your gateway. (or if this is an intranet machine, pick a port on the intranet. Same deal.)

Ping your server address from another computer. Preferably one that is NOT on the same network as your server.

Port scan the remote address. There are many tools used to do this; but essentially the scanner should tell you port 3306 is open. If it doesnt, investigate your network routing, make sure nothing’s routing port 3306 somewhere else.