How to grant all privileges to root user in MySQL 8.0
Solution 1:
Starting with MySQL 8 you no longer can (implicitly) create a user using the GRANT
command. Use CREATE USER instead, followed by the GRANT statement:
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'PASSWORD';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
Caution about the security risks about WITH GRANT OPTION
, see:
- Grant all privileges on database
Solution 2:
I see a lot of (wrong) answers, it is just as simple as this:
USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'P@ssW0rd';
GRANT ALL ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
Note: instead of a self-created user
you can use root
to connect to the database. However, using the default root account to let an application connect to the database is not the preferred way.
Alternative privileges (be careful and remember the least-privilege principle):
-- Grant user permissions to all tables in my_database from localhost --
GRANT ALL ON my_database.* TO 'user'@'localhost';
-- Grant user permissions to my_table in my_database from localhost --
GRANT ALL ON my_database.my_table TO 'user'@'localhost';
-- Grant user permissions to all tables and databases from all hosts --
GRANT ALL ON *.* TO 'user'@'*';
If you would somehow run into the following error:
ERROR 1130 (HY000): Host ‘1.2.3.4’ is not allowed to connect to this MySQL server
You need add/change the following two lines in /etc/mysql/my.cnf
and restart mysql:
bind-address = 0.0.0.0
skip-networking
Solution 3:
1) This worked for me. First, create a new user. Example: User foo
with password bar
> mysql> CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';
2) Replace the below code with a username with 'foo'.
> mysql> GRANT ALL PRIVILEGES ON database_name.* TO'foo'@'localhost';
Note: database_name is the database that you want to have privileges, . means all on all
3) Login as user foo
mysql> mysql -u foo -p
Password: bar
4) Make sure your initial connection from Sequelize is set to foo with pw bar.
Solution 4:
For those who've been confused by CREATE USER 'root'@'localhost'
when you already have a root account on the server machine, keep in mind that your 'root'@'localhost'
and 'root'@'your_remote_ip'
are two different users (same user name, yet different scope) in mysql server. Hence, creating a new user with your_remote_ip
postfix will actually create a new valid root
user that you can use to access the mysql server from a remote machine.
For example, if you're using root
to connect to your mysql server from a remote machine whose IP is 10.154.10.241
and you want to set a password for the remote root account which is 'Abcdef123!@#'
, here are steps you would want to follow:
-
On your mysql server machine, do
mysql -u root -p
, then enter your password forroot
to login. -
Once in
mysql>
session, do this to create root user for the remote scope:mysql> CREATE USER 'root'@'10.154.10.241' IDENTIFIED BY 'Abcdef123!@#';
-
After the
Query OK
message, do this to grant the newly created root user all privileges:mysql> GRANT ALL ON *.* TO 'root'@'10.154.10.241';
-
And then:
FLUSH PRIVILEGES;
-
Restart the mysqld service:
sudo service mysqld restart
-
Confirm that the server has successfully restarted:
sudo service mysqld status
If the steps above were executed without any error, you can now access to the mysql server from a remote machine using root
.
Solution 5:
My Specs:
mysql --version
mysql Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)
What worked for me:
mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'desired_password';
mysql> GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' WITH GRANT OPTION;
Response in both queries:
Query OK, O rows affected (0.10 sec*)
N.B: I created a database (db_name) earlier and was creating a user credential with all privileges granted to all tables in the DB in place of using the default root user which I read somewhere is a best practice.