Recovering a MySQL `root` password: the fourth solution

Have just read Darren Cassar’s Recovering a MySQL `root` password – Three solutions. There’s a fourth solution: using an init-file, which leads to just one restart of the database instead of two. It also avoids the security issue involved with using skip-grant-tables.

I’ve written all about it before on Dangers of skip-grant-tables.

Darren’s 1st advice (look for password ini files, scripts, etc.) is a very good one. One password that can always be looked up in files is the replication’s password.

Replication’s password is easily forgotten: you only set it once and never use it again; never script it nor manually login with. When setting up new slaves, though, you suddenly need it.

Apparently not many realize that the replication password is written in plaintext in the master.info file. This file tells the slave all about it’s master connection: host, port, user & password are all there for you to read.

13
Leave a Reply

avatar
13 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
7 Comment authors
Rômulo CollopyDarren CassarKedarAleksandr Kuzminskyshlomi Recent comment authors

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  Subscribe  
Notify of
Aleksandr Kuzminsky
Guest
Aleksandr Kuzminsky

There is also the fifth way that doesn’t require restart at all.

Open user.MYD in vim, replace the password string with 42 spaces(if passwords are new), then killall -1 mysqld.
Voilà!

Just two notes:
1. user.MYD can be fragmented. You have to either find all 42 charachters from the password or defragment the table with myisamchk
2. Table `user` will be corrupted after this password recovery – you need to repair it. REPAIR TABLE will remove the root record from `user`. Add it right after the repair.

Ronald Bradford
Guest

The fifth solution you speak of is what Darren’s original article describes as point 3.

strcmp
Guest
strcmp

You can copy data/mysql/user.* to another database where you have the UPDATE privilege, set the password to PASSWORD(‘word’) or change the privileges and move the files back to data/mysql/.

strcmp
Guest
strcmp

@shlomi: It took a while to figure out why you think that. user.* is not a magic object but a normal MyISAM table, it is only special at its original place. Of course you shouldn’t put it into another mysql schema/database/directory, that would mean overwriting another user list anyway, which is not our goal. But you _can_ put it into another schema on the same database, or into another database, just not into the mysql schema, I have recovered a root account this way some years ago, it definitely works.

strcmp
Guest
strcmp

I had meant both “schema” and “MySQL instance (into another schema)” at once. 🙂 Yes, “database” is confusing, I should have used another word.

In my case editing the password field as in the first tips would not have helped anyway, because all of root’s grant columns were set to ‘N’, the password was ok.

Aleksandr Kuzminsky
Guest
Aleksandr Kuzminsky

@Ronald: Oh indeed. I’m sorry – couldn’t open Darren’s article and was confused by “…instead of two”.

Kedar
Guest

@Aleksandr & @strcmp, Both the ways are well thought 🙂

Darren Cassar
Guest

@Aleksandr: Sorry I’ve been having some issues with my hosting provider, hopefully will move soon.
@Shlomi: The copying and pasting of tables is purely backing stuff up in case a rollback is needed. Thanks for a fourth solution btw.

Rômulo Collopy
Guest
Rômulo Collopy
trackback

[…] are even more solutions! Please refer to a past blog post of mine. Make sure to check out comment #4 by […]