Disclaimer: Reset the MySQL root password at your own risk! It doesn’t apply if you’re using Pluggable authentication and certainly won’t be usable if/when MySQL system tables are stored on InnoDB

The situation is the classic “need to reset MySQL root password” but you cannot restart MySQL (because it is the master production server, or any other reason), which makes the –skip-grant-tables solution as a no-no possibility.
There is a workaround, which is the following:
That simple? No, but close. Here is the step by step:
|
1 |
[root@machina dbdata]# mkdir datadir<br>[root@machina dbdata]# chown -R mysql:mysql datadir/<br>[root@machina dbdata]# mysql_install_db --datadir=/dbdata/datadir/ --user=mysql<br>Installing MySQL system tables...OK<br>Filling help tables...OK<br> |
|
1 |
[root@machina datadir]# /usr/sbin/mysqld --basedir=/usr --datadir=/dbdata/datadir --plugin-dir=/usr/lib/mysql/plugin --skip-innodb --default-storage-engine=myisam --socket=/var/run/mysqld/mysql2.sock --port=3307 --user=mysql --log-error=/dblogs/log/error2.log --pid-file=/dbdata/data/mysql.pid &<br> |
|
1 |
[root@machina ~]# cp /dbdata/data/mysql/user.* /dbdata/datadir/mysql/cp: overwrite `/dbdata/datadir/mysql/user.frm'? y<br>cp: overwrite `/dbdata/datadir/mysql/user.MYD'? y<br>cp: overwrite `/dbdata/datadir/mysql/user.MYI'? y<br><br>[root@machina datadir]# mysql --socket=/var/run/mysqld/mysql2.sock -p<br>Enter password:<br>Welcome to the MySQL monitor. Commands end with ; or g.<br> |
|
1 |
mysql2> flush tables;<br>mysql2> select user, host, password from user where user like 'root';<br>+------+--------------------------------------+------------------------------------------+<br>| user | host | password |<br>+------+--------------------------------------+------------------------------------------+<br>| root | localhost | 696D727429CC43695423FA5F2F0155D92A0AAC08 |<br>| root | 127.0.0.1 | 696D727429CC43695423FA5F2F0155D92A0AAC08 |<br>| root | % | 696D727429CC43695423FA5F2F0155D92A0AAC08 |<br>+------+--------------------------------------+------------------------------------------+<br>3 rows in set (0.00 sec)<br> |
|
1 |
mysql2> update mysql.user set password='*696D727429CC43695423FA5F2F0155D92A0AAC08' where user like 'root';<br>Query OK, 3 rows affected (0.00 sec)<br>Rows matched: 3 Changed: 3 Warnings: 0<br> |
|
1 |
mysql2> select user, host, password from user where user like 'root';<br>+------+--------------------------------------+-------------------------------------------+<br>| user | host | password |<br>+------+--------------------------------------+-------------------------------------------+<br>| root | localhost | *696D727429CC43695423FA5F2F0155D92A0AAC08 |<br>| root | 127.0.0.1 | *696D727429CC43695423FA5F2F0155D92A0AAC08 |<br>| root | % | *696D727429CC43695423FA5F2F0155D92A0AAC08 |<br>+------+--------------------------------------+-------------------------------------------+<br>3 rows in set (0.00 sec)<br> |
|
1 |
mysql2> flush privileges;<br>Query OK, 0 rows affected (0.00 sec)<br> |
|
1 |
[root@machina ~]# cd /dbdata/datadir/mysql/<br>[root@machina mysql]# cp user.* /dbdata/data/mysql/; chown mysql:mysql /dbdata/data/mysql/user.*; chmod 660 /dbdata/data/mysql/user.*<br>cp: overwrite `/dbdata/data/mysql/user.frm'? y<br>cp: overwrite `/dbdata/data/mysql/user.MYD'? y<br>cp: overwrite `/dbdata/data/mysql/user.MYI'? y<br> |
|
1 |
[root@machina datadir]# mysqladmin --socket=/var/run/mysqld/mysql2.sock -p shutdown<br>Enter password:<br>141120 06:59:14 mysqld_safe mysqld from pid file /dbdata/data/mysql.pid ended<br> |
|
1 |
[root@machina datadir]# kill -1 $(/sbin/pidof mysqld)<br> |
|
1 |
[root@machina datadir]# mysql -p<br>Enter password:<br>Welcome to the MySQL monitor. Commands end with ; or g.<br>Your MySQL connection id is 101208<br><br>mysql1> select user, host, password from mysql.user where user like 'root';<br>+------+--------------------------------------+-------------------------------------------+<br>| user | host | password |<br>+------+--------------------------------------+-------------------------------------------+<br>| root | localhost | *696D727429CC43695423FA5F2F0155D92A0AAC08 |<br>| root | 127.0.0.1 | *696D727429CC43695423FA5F2F0155D92A0AAC08 |<br>| root | % | *696D727429CC43695423FA5F2F0155D92A0AAC08 |<br>+------+--------------------------------------+-------------------------------------------+<br>3 rows in set (0.00 sec)<br> |
|
1 |
mysql1> show databases;<br>+--------------------+<br>| Database |<br>+--------------------+<br>| information_schema |<br>| mysql |<br>| percona |<br>| testing |<br>+--------------------+<br>4 rows in set (0.03 sec)<br> |
We’ve successfully reset the MySQL root password without the need to restart MySQL and thus avoid downtime.
I hope you never face this situation, but in case you do, there’s a workaround to recover your access! Is there another way to perform this?
Share it with the world!
Resources
RELATED POSTS