149

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
  • Try accesing the server with 'root'@'127.0.0.1' which is diferent from 'root'@'localhost'. Then issue a command to create the user 'root'@'localhost' and grant all privileges to it.
    – Gimmy
    Jun 3, 2013 at 8:06
  • Also see How to have MySQL entitle the root user? on Super User. It attempts to avoid resetting passwords.
    – jww
    Apr 2, 2016 at 11:28
  • I just had a space between -p and the password. I know its silly but might help someone.
    – Vinay W
    Feb 23, 2017 at 7:18

7 Answers 7

150

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
  • 1
    "$ mysqld --skip-grant-tables" and " InnoDB: Unable to lock ./ibdata1, error: 35 InnoDB: Check that you do not already have another mysqld process InnoDB: using the same InnoDB data or log files. " ?
    – Vogelsire
    Jun 3, 2013 at 7:42
  • see my update above
    – Yogus
    Jun 3, 2013 at 7:45
  • I found that stopping mysql before issuing the 1st command stops the lock error from happening - service mysql stop May 28, 2015 at 3:09
  • 9
    Apparently the 'password' column no longer exists... it has been replaced by 'authentication_string'. So the password update string is now: UPDATE user SET authentication_string=PASSWORD('my_password') where USER='root';
    – jdmcnair
    Dec 23, 2015 at 17:03
  • 1
    Thank you! And now I'm curious: what could have caused this? On Windows? Dec 2, 2016 at 16:38
90

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: https://dev.mysql.com/doc/refman/5.7/en/native-authentication-plugin.html

13
  • 8
    This solved it for me. When I looked at the status of the mysql daemon, I saw this warning: "[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored." Setting plugin to '' allowed me to login again. Thank you, @Mario Flores
    – SpacePope
    Sep 29, 2016 at 17:07
  • 2
    set plugin='mysql_native_password' did it for me, thanks! For reference: dev.mysql.com/doc/refman/5.7/en/…
    – Koen.
    Dec 8, 2016 at 10:55
  • 2
    Why is this still a problem for ground up package installs going into 2018 ?
    – mckenzm
    Oct 1, 2017 at 6:31
  • 1
    Well, the MariaDB default plugin="unix_socket"is so secure, that it really takes a while to get connected :) Thanks for this answer, worked for me.
    – BurninLeo
    Dec 7, 2017 at 11:51
  • 4
    ubuntu 18 , and it worked Jun 23, 2018 at 17:48
9

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 https://dev.mysql.com/doc/refman/5.6/en/authentication-plugins.html

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
  • 2
    For someone else that runs across this, when running mysql server 5.7.15, this actually locks your user out if you do not provide a plugin. Probably what you are looking for is a plugin of mysql_native_password. Sep 28, 2016 at 17:41
7
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
  • Although this may answer the question, you should give a more detailed description of the linked content and explain how it relates to the question. This will help ensure that this answer remains useful in the event the linked page is removed or goes offline. For more information, see this Meta Stack Exchange post.
    – bwDraco
    Jan 22, 2016 at 23:15
  • This is the use case I saw, I'm installing mysql on RHEL7 in AWS with Ansible and I'm getting the same behavior after reconfiguring and restarting the DB. Do you know why this happens on the first place, is blocking Ansible from accessing the local mysqld and configuring it. This is just for testing purposes.
    – eco
    May 13, 2016 at 21:43
  • Apparently it depends on how you initialize the server, look at step 4 here: dev.mysql.com/doc/refman/5.7/en/…
    – eco
    May 13, 2016 at 21:48
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
  • 6
    Can you describe what the --no-defaults --force switches do? Otherwise, it's a VLQ duplicate of the above, accepted answer. Feb 21, 2014 at 17:17
  • @CanadianLuke no defaults skips any configuration files present that it'd otherwise include, force continues operation even if any of the issued SQL commands fails. When in doubt, check the manual
    – deucalion
    May 26, 2015 at 11:39
  • 3
    It needs to be edited in to the answer May 26, 2015 at 14:31
  • 2
    I get ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
    – Jonathan
    May 16, 2016 at 15:38
  • 1
    @JonathanLeaders look: stackoverflow.com/questions/30692812/… May 18, 2016 at 0:47
3

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.

1

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
  • New error meets, like ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
    – rosefun
    Nov 14, 2020 at 6:56

Not the answer you're looking for? Browse other questions tagged or ask your own question.