187

I lost my MySQL username and password. How do I retrieve it?

lemon
  • 14,875
  • 6
  • 18
  • 38
Marcel
  • 6,143
  • 15
  • 46
  • 52

11 Answers11

202

Stop the MySQL process.

Start the MySQL process with the --skip-grant-tables option.

Start the MySQL console client with the -u root option.

List all the users;

SELECT * FROM mysql.user;

Reset password;

UPDATE mysql.user SET Password=PASSWORD('[password]') WHERE User='[username]';

But DO NOT FORGET to

Stop the MySQL process

Start the MySQL Process normally (i.e. without the --skip-grant-tables option)

when you are finished. Otherwise, your database's security could be compromised.

Community
  • 1
  • 1
Xenph Yan
  • 83,019
  • 16
  • 48
  • 55
  • 8
    Think you don't need to restart the daemon for resetting normal users. just "FLUSH PRIVILEGES;" after updating the user password. --skip-grant-tables only required for a root user password reset! This would generally not be recommended for a standard user reset. – Amos Folarin Oct 11 '13 at 10:41
  • What is the significance of using the `dpkg-reconfigure mysql-server-5.5` command to reset the root MySQL password ? – phillipsK May 24 '15 at 04:38
  • @Xenph, Why do you say "*Start the MySQL console client with the -u root option*"? There's no point in doing that at all as `-u` is ignored when server is started with `--skip-grant-tables`. – Pacerier Apr 22 '16 at 04:33
  • 25
    In MySQL 5.7.*, there is no column in `mysql.user` called `password`, use `authentication_string` instead. – Adib Aroui Jul 25 '16 at 19:03
  • my sql 5.5. the select command shows an encrypted password. how do i see the actual password ? – MasterJoe Sep 22 '16 at 20:09
  • 3
    I found this + http://stackoverflow.com/a/35277160/1604601 very helpful – Alien Life Form Dec 03 '16 at 02:16
  • I get `Unknown column 'Password' in 'field list'` after resetting password. – Timo Feb 09 '19 at 13:25
  • 1
    PASSWORD() function is deprecated after version 5.7.5. See also https://stackoverflow.com/questions/52320576 – Leland Hepworth Mar 18 '21 at 14:48
48

Unfortunately your user password is irretrievable. It has been hashed with a one way hash which if you don't know is irreversible. I recommend go with Xenph Yan above and just create an new one.

You can also use the following procedure from the manual for resetting the password for any MySQL root accounts on Windows:

  1. Log on to your system as Administrator.
  2. Stop the MySQL server if it is running. For a server that is running as a Windows service, go to the Services manager:

Start Menu -> Control Panel -> Administrative Tools -> Services

Then find the MySQL service in the list, and stop it. If your server is not running as a service, you may need to use the Task Manager to force it to stop.

  1. Create a text file and place the following statements in it. Replace the password with the password that you want to use.

    UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';
    FLUSH PRIVILEGES;
    

    The UPDATE and FLUSH statements each must be written on a single line. The UPDATE statement resets the password for all existing root accounts, and the FLUSH statement tells the server to reload the grant tables into memory.

  2. Save the file. For this example, the file will be named C:\mysql-init.txt.
  3. Open a console window to get to the command prompt:

    Start Menu -> Run -> cmd

  4. Start the MySQL server with the special --init-file option:

    C:\> C:\mysql\bin\mysqld-nt --init-file = C:\mysql-init.txt
    

    If you installed MySQL to a location other than C:\mysql, adjust the command accordingly.

    The server executes the contents of the file named by the --init-file option at startup, changing each root account password.

    You can also add the --console option to the command if you want server output to appear in the console window rather than in a log file.

    If you installed MySQL using the MySQL Installation Wizard, you may need to specify a --defaults-file option:

    C:\> "C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld-nt.exe" --defaults-file="C:\Program Files\MySQL\MySQL Server 5.0\my.ini" --init-file=C:\mysql-init.txt
    

    The appropriate --defaults-file setting can be found using the Services Manager:

    Start Menu -> Control Panel -> Administrative Tools -> Services

    Find the MySQL service in the list, right-click on it, and choose the Properties option. The Path to executable field contains the --defaults-file setting.

  5. After the server has started successfully, delete C:\mysql-init.txt.
  6. Stop the MySQL server, then restart it in normal mode again. If you run the server as a service, start it from the Windows Services window. If you start the server manually, use whatever command you normally use.

You should now be able to connect to MySQL as root using the new password.

Monic
  • 726
  • 10
  • 31
jake
  • 1,435
  • 2
  • 14
  • 22
  • 6
    @Jake - thanks for the answer. I wanted to give it a thumbs up but for some reason stackoverflow wont allow me to do so because of reputation points. your explanation "unfortunately your user password is irretrievable. it has been hashed with a one way hash which if you don't know is irreversible" was the key to my understanding why everything else that I read on google ONLY gave me directions to *change* my password. good explanations are more insightful than instructions alone. – dsdsdsdsd Sep 26 '11 at 08:10
  • 1
    @jake i can not find mysql in the services list Please tell me what to do? –  Feb 23 '13 at 11:02
  • 1
    Why is yours `mysqld-nt` instead of `mysqld`? – Pacerier Apr 22 '16 at 05:15
  • Btw, is there a non-file option of `--init-file`? (Something similar to mysql.exe's [`--execute`](http://stackoverflow.com/a/1602935/632951) command.) – Pacerier Apr 22 '16 at 05:26
35

An improvement to the most useful answer here:

1] No need to restart the mysql server
2] Security concern for a MySQL server connected to a network

There is no need to restart the MySQL server.

use FLUSH PRIVILEGES; after the update mysql.user statement for password change.

The FLUSH statement tells the server to reload the grant tables into memory so that it notices the password change.

The --skip-grant-options enables anyone to connect without a password and with all privileges. Because this is insecure, you might want to

use --skip-grant-tables in conjunction with --skip-networking to prevent remote clients from connecting.

from: reference: resetting-permissions-generic

ThinkingMonkey
  • 12,539
  • 13
  • 57
  • 81
  • 1
    @ThinkingMonkey, Doesn't this assume that the current logged on user has privileges to modify `mysql.user`? Often though, that's not the case. – Pacerier Apr 22 '16 at 05:16
9

Do it without down time

Run following command in the Terminal to connect to the DBMS (you need root access):

sudo mysql -u root -p;

run update password of the target user (for my example username is mousavi and it's password must be 123456):

UPDATE mysql.user SET authentication_string=PASSWORD('123456') WHERE user='mousavi';  

at this point you need to do a flush to apply changes:

FLUSH PRIVILEGES;

Done! You did it without any stop or restart mysql service.

S.M.Mousavi
  • 5,013
  • 7
  • 44
  • 59
6

While you can't directly recover a MySQL password without bruteforcing, there might be another way - if you've used MySQL Workbench to connect to the database, and have saved the credentials to the "vault", you're golden.

On Windows, the credentials are stored in %APPDATA%\MySQL\Workbench\workbench_user_data.dat - encrypted with CryptProtectData (without any additional entropy). Decrypting is easy peasy:

std::vector<unsigned char> decrypt(BYTE *input, size_t length) {
    DATA_BLOB inblob { length, input };
    DATA_BLOB outblob;

    if (!CryptUnprotectData(&inblob, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &outblob)) {
            throw std::runtime_error("Couldn't decrypt");
    }

    std::vector<unsigned char> output(length);
    memcpy(&output[0], outblob.pbData, outblob.cbData);

    return output;
}

Or you can check out this DonationCoder thread for source + executable of a quick-and-dirty implementation.

Markus Safar
  • 6,324
  • 5
  • 28
  • 44
snemarch
  • 4,958
  • 26
  • 38
  • 2
    This was perfect. There is an exe with source code on the thread snemarch mentioned to retrieve my user account password stored in my MySQL Workbench vault. Although these other methods would probably work too if I had rights to read or update the user table. – RobbZ Nov 27 '15 at 10:26
  • But relatively speaking, very little people are using Workbench. – Pacerier Apr 22 '16 at 05:18
  • Here is another implementation which can be run after building with Visual Studio to recover Workbench's stored username and password information: https://github.com/wclear/MySQLWorkbenchPasswordViewer – bnp887 Aug 10 '16 at 19:48
5

Login MySql from windows cmd using existing user:

mysql -u username -p
Enter password:****

Then run the following command:

mysql> SELECT * FROM mysql.user;

After that copy encrypted md5 password for corresponding user and there are several online password decrypted application available in web. Using this decrypt password and use this for login in next time. or update user password using flowing command:

mysql> UPDATE mysql.user SET Password=PASSWORD('[password]') WHERE User='[username]';

Then login using the new password and user.

Markus Safar
  • 6,324
  • 5
  • 28
  • 44
Syeful Islam
  • 3,785
  • 1
  • 20
  • 19
5

If you have root access to the server where mysql is running you should stop the mysql server using this command

sudo service mysql stop

Now start mysql using this command

sudo /usr/sbin/mysqld --skip-grant-tables  --skip-networking &

Now you can login to mysql using

sudo mysql
FLUSH PRIVILEGES;
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');

Full instructions can be found here http://www.techmatterz.com/recover-mysql-root-password/

Sajjad Ashraf
  • 3,754
  • 1
  • 34
  • 35
1

After MySQL 5.7.6 and MariaDB 10.1.20 (currently in 2022) you can:

Update a mysql user password having access to root user

ALTER USER 'some_user_name'@'localhost' IDENTIFIED BY 'a_super_secure_password';

Update mysql root user

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'mynewpassword';

List all users

select user from mysql.user;
Vega
  • 27,856
  • 27
  • 95
  • 103
Raikish
  • 634
  • 2
  • 6
  • 20
0

IF you happen to have ODBC set up, you can get the password from the ODBC config file. This is in /etc/odbc.ini for Linux and in the Software/ODBC folder in the registry in Windows (there are several - it may take some hunting)

samplesize1
  • 111
  • 5
0

Save the file. For this example, the file will be named C:\mysql-init.txt. it asking administrative permisions for saving the file

-1

Although a strict, logical, computer science'ish interpretation of the op's question would be to require both "How do I retrieve my MySQL username" and "password" - I thought It might be useful to someone to also address the OR interpretation. In other words ...

1) How do I retrieve my MySQL username?

OR

2) password

This latter condition seems to have been amply addressed already so I won't bother with it. The following is a solution for the case "How do i retreive my MySQL username" alone. HIH.

To find your mysql username run the following commands from the mysql shell ...

SELECT User FROM mysql.user;

it will print a table of all mysql users.

shine
  • 17
  • 2
  • 2
    This is a late answer and you should post these only if your solution is clearly different from already posted or accepted. It is not in this case, especially that your answer duplicate an accepted one. – m.cekiera Jun 04 '15 at 23:08