mysql how to fix Access denied for user 'root'@'localhost'

Before I screw up something, when I login using $ mysql -u root -p, and show databases:

+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | game_data | | test | +--------------------+ 

Then I tried to create a new user and notice something is wrong with the PRIVILEGES.

So I deleted the new users, and I guess I removed the 'root' and 'Admin' accidentally.

Then I try to create 'root' again, but get Access denied error when doing grant all privileges.

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'password'; mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option; ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 

If I login to MySQL again using $ mysql -u root -p, and show databases,

+--------------------+ | Database | +--------------------+ | information_schema | +--------------------+ 

All the other databases are gone.

How do I fix MySQL now?

I cannot find the database 'mysql', cannot create database, create user, anything I try to do will get an error.

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES).

Should I reinstall MySQL using MacPorts? If reinstall, I will lose the database game_data, right?

3

7 Answers

Follow the steps below.

  1. Start the MySQL server instance or daemon with the --skip-grant-tables option (security setting).

    $ mysqld --skip-grant-tables 
  2. Execute these statements.

    $ mysql -u root mysql $mysql> UPDATE user SET Password=PASSWORD('my_password') where USER='root'; $mysql> FLUSH PRIVILEGES; 

If you face the unknown field Password error above use:

update user set authentication_string=password('my_password') where user='root'; 
  1. Finally, restart the instance/daemon without the --skip-grant-tables option.

    $ /etc/init.d/mysql restart 

You should now be able to connect with your new password.

$ mysql -u root -p 

Enter password: my_password

Fix for MySQL “Unable to lock ibdata1” error

sudo mv /usr/local/mysql/data/ibdata1 /usr/local/mysql/data/ibdata1.bak sudo mv /usr/local/mysql/data/ib_logfile0 /usr/local/mysql/data/ib_logfile0.bak sudo mv /usr/local/mysql/data/ib_logfile1 /usr/local/mysql/data/ib_logfile1.bak sudo cp -a /usr/local/mysql/data/ibdata1.bak /usr/local/mysql/data/ibdata1 sudo cp -a /usr/local/mysql/data/ib_logfile0.bak /usr/local/mysql/data/ib_logfile0 sudo cp -a /usr/local/mysql/data/ib_logfile1.bak /usr/local/mysql/data/ib_logfile1 sudo /etc/init.d/mysql restart 
9

None of the above were helpful for me. I found I needed to clear the plugin method. In 5.6, I could do:

sudo mysql -u root use mysql; [mysql] update user set plugin='' where User='root'; [mysql] flush privileges; 

In 5.7, I found I needed to:

sudo mysql -u root use mysql; [mysql] update user set plugin='mysql_native_password' where User='root'; [mysql] flush privileges; 

According to the docs, with plugin set to an empty string, it should have effectively defaulted to mysql_native_password, but may be getting confused by an empty password hash. For more nuance, you can read the documentation here:

13

Also make sure needed record in table user has empty plugin field (there can be, for example, "unix_socket").

Since version 5.5.7 mysql has various auth plugins support

So if you have non-empty plugin field then password would be ignored and there would be warning at mysql error log (for me it's /var/log/mysql/error.log):

[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored.

1
grep 'temporary password' /var/log/mysqld.log Sort date (newest date) 

You may see something like this;

[root@SERVER ~]# grep 'temporary password' /var/log/mysqld.log 2016-01-16T18:07:29.688164Z 1 [Note] A temporary password is generated for root@localhost: O,k5.marHfFu 2016-01-22T13:14:17.974391Z 1 [Note] A temporary password is generated for root@localhost: b5nvIu!jh6ql 2016-01-22T15:35:48.496812Z 1 [Note] A temporary password is generated for root@localhost: (B*=T!uWJ7ws 2016-01-22T15:52:21.088610Z 1 [Note] A temporary password is generated for root@localhost: %tJXK7sytMJV 2016-01-22T16:24:41.384205Z 1 [Note] A temporary password is generated for root@localhost: lslQDvgwr3/S 2016-01-22T22:11:24.772275Z 1 [Note] A temporary password is generated for root@localhost: S4u+J,Rce_0t [root@SERVER ~]# mysql_secure_installation 

Securing the MySQL server deployment.

Enter password for user root: The existing password for the user account root has expired. Please set a new password. New password: Re-enter new password: 

If you see it says

... Failed! Error: Your password does not satisfy the current policy requirements That means your password needs to have a character such as ! . # - etc... mix characters well, upper case, lower case, ! . , # etc... New password: Re-enter new password: The 'validate_password' plugin is installed on the server. The subsequent steps will run with the existing configuration of the plugin. Using existing password for root. Estimated strength of the password: 100 Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y New password: Re-enter new password: Estimated strength of the password: 100 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y Success. Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y Success. By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y - Dropping test database... Success. - Removing privileges on test database... Success. Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y Success. All done! [root@SERVER ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 5.7.10 MySQL Community Server (GPL) 

Watch the last 10 minutes of this video, it teaches you how you do it.

3

Try it:

mysql --no-defaults --force --user=root --host=localhost --database=mysql UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root'; FLUSH PRIVILEGES; 
5

In my case I had a database corruption, after restarting mysql on Debian the root login was without password. The solution was this :

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test'; 

Some other answers also have mentioned the native_password plugin but this is how you can do it without complicated fiddling around. That's how it is meant to be changed.

The official documentation proposed something different:

First, create an SQL file setting the new password like this:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass'; 

Then start mysqld with the --init-file parameter, for example:

mysqld --init-file=/home/me/mysql-init & 

Do not forget to kill the newly started mysqld server after verifying the new password was set.

1

You Might Also Like