Where the open source database community meets: Use code PERCONA75 and secure your spot for Percona Live.  Register

Reinstall MySQL and Preserve All MySQL Grants and Users

January 11, 2017
Author
Peter Zaitsev
Share this Post:

MySQL Grants and UsersIn this blog post, we’ll look at how to preserve all MySQL grants and users after reinstalling MySQL.

Every so often, I need to reinstall a MySQL version from scratch and preserve all the user accounts and their permissions (or move the same users and privileges to another server).

As of MySQL 5.7, MySQL does not make this easy! MySQL SHOW GRANTS only shows permissions for one user, and the method suggested on StackExchange – dumping tables containing grants information directly – is not robust (as Rick James mentions in the comments). It also doesn’t work between different MySQL versions.

This problem is easily solved, however, with the pt-show-grants tool from Percona Toolkit (which serves pretty much as a mysqldump for user privileges).

All you need to do is:

    1. On the source, or to backup MySQL privileges, run:

    1. On the target, or to restore MySQL privileges, run:

    1. If you would like to clean up the old privileges from MySQL before loading new ones, use:

This removes all the users (except the root user, which you will need to connect back and load new privileges).

With Percona Toolkit, preserving your grants and user privileges is easy!

0 0 votes
Article Rating
Subscribe
Notify of
guest

10 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Daniel Popiniuc
9 years ago

As Percona does not support Windows as operation system I’m afraid that’s not an option, so to solve similar problem in a consistent manner for multi-platforms I have developed a small PHP package: https://github.com/danielgp/rights-mysql that might be useful or at least provide an alternative.

Fernando Mario
Fernando Mario
9 years ago

Excellent tool

lefred
lefred
9 years ago

mysqlpump also provides you similar functionality (http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html)

I agree that mysqlpump didn’t currently receive the deserved attention from Community 😉

try:

mysqlpump –exclude-databases=% –users

lefred
lefred
9 years ago
Reply to  Peter Zaitsev

Unfortunately myqlpump works only with version >= 5.7.8:

Server version is not compatible. Server version should be 5.7.8 or above.

Georgi Iovchev
Georgi Iovchev
9 years ago

upto 5.6 I use:

mysql -NBe”select distinct concat( ‘SHOW GRANTS FOR ‘,quote(user),’@’,quote(host),’;’) from mysql.user;” | mysql -NB> perms.sql

In 5.7 we have new command “show create user”, that can be used in the same way for generating create user statements:

mysql -NBe”select distinct concat( ‘SHOW CREATE USER ‘,quote(user),’@’,quote(host),’;’) from mysql.user;” | mysql -NB > users.sql
mysql -NBe”select distinct concat( ‘SHOW GRANTS FOR ‘,quote(user),’@’,quote(host),’;’) from mysql.user;” | mysql -NB >> users.sql

Fadi El-Eter (itoctopus)
Reply to  Georgi Iovchev

Thank you – but are you sure these work? You get something like:

GRANT ALL PRIVILEGES ON roundcube.* TO ’roundcube’@’localhost’

Note the quotes around the @ sign. This code doesn’t really work… Of course, this is a simple parsing issue, but I think there are other issues as well. Can you confirm that you have tried the above code successfully?

What’s nice about the Percona tool is that it does everything in one shot. I really did want to use yours – but it just needs a little more work…

Thanks again!

Far
Enough.

Said no pioneer ever.
MySQL, PostgreSQL, InnoDB, MariaDB, MongoDB and Kubernetes are trademarks for their respective owners.
© 2026 Percona All Rights Reserved