MySQL root access from all hosts

I’ve installed MySQL server on a remote Ubuntu machine. The root user is defined in the mysql.user table this way:

mysql> SELECT host, user, password FROM user WHERE user = 'root';
| host             | user | password                                  |
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
|        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |

I can access with user root from the same remote machine command-line interface using the standard mysql client. Now I want to allow root access from every host on the internet, so I tried adding following row (it’s an exact duplicate of the first row from previous dump, except for the host column):

mysql> SELECT host, user, password FROM user WHERE host = '%';
| host             | user | password                                  |
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |

But my client on my personal PC continues to tell me (I obscured the server IP):

SQL Error (2003): Can’t connect to MySQL server on ’46.x.x.x’ (10061)

I can’t tell if it’s a authentication error or a network error. On the server firewall I enabled port 3306/TCP for, and that’s ok for me…


Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1


As mentioned in the comments, since MySql 8 you need to first explicitly create the user, so the command will look like:


Original answer:

There’s two steps in that process:

a) Grant privileges. As root user execute with this substituting 'password' with your current root password :


b) bind to all addresses:

The easiest way is to comment out the line in your my.cnf file:

#bind-address =

and restart mysql

service mysql restart

By default it binds only to localhost, but if you comment the line it binds to all interfaces it finds. Commenting out the line is equivalent to bind-address=*.

To check where mysql service has binded execute as root:

netstat -tupan | grep mysql

Update For Ubuntu 16:

Config file is (now)


(at least on standard Ubuntu 16)

Method 2

Run the following query:

use mysql;
update user set host='%' where host='localhost'

NOTE: Not recommended for production use.

Method 3

MYSQL 8.0 – open mysql command line client

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';  

use mysql

UPDATE mysql.user SET host='%' WHERE user='root';  

Restart mysql service

Method 4


bind-address =

should be

bind-address = *

Method 5

MariaDB running on Raspbian – the file containing bind-address is hard to pinpoint. MariaDB have some not-very-helpful-info on the subject.

I used

# sudo grep -R bind-address /etc

to locate where the damn thing is.

I also had to set the privileges and hosts in the mysql like everyone above pointed out.

And also had some fun time opening the 3306 port for remote connections to my Raspberry Pi – finally used iptables-persistent.

All works great now.

Method 6

I’m using AWS LightSail and for my instance to work, I had to change:

bind-address =


bind-address = <Private IP Assigned by Amazon>

Then I was able to connect remotely.

Method 7

if you have many networks attached to you OS, yo must especify one of this network in the bind-addres from my.conf file.
an example:

bind-address =

this ip is from a ethX configuration.

Method 8

In my case the “bind-address” setting was the problem. Commenting this setting in my.cnf did not help, because in my case mysql set the default to for some reason.

To verify what setting MySql is currently using, open the command line on your local box:

mysql -h localhost -u myname -pmypass mydb

Read out the current setting:

Show variables where variable_name like "bind%"

You should see here if you want to allow access from all hosts. If this is not the case, edit your /etc/mysql/my.cnf and set bind-address under the [mysqld] section:


Finally restart your MySql server to pick up the new setting:

sudo service mysql restart

Try again and check if the new setting has been picked up.

Method 9

Update the bind-address = in the /etc/mysql/mysql.conf.d/mysqld.cnf and from the mysql command line allow the root user to connect from any Ip.

Below was the only commands worked for mysql-8.0 as other were failing with error syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'abcd'' at line 1

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
UPDATE mysql.user SET host='%' WHERE user='root';

Restart the mysql client

sudo service mysql restart

Method 10

mysql_update is what you need.

I don’t know why anyone would follow the more complex ways of correcting this issue, when MySql graciously built a tool that already does this…

All methods was sourced from or, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Notify of

Inline Feedbacks
View all comments
Would love your thoughts, please comment.x