Como he comentado, los usuarios se encuentran en la base de datos de sistema «mysql» y la tabla «user» (mysql.user). Para extraer los privilegios necesitamos dos pasos:
El primer paso consisten en extraer el lista de usuarios del sistema pero construyendo a la vez una consulta SQL para cada uno que nos permita luego extraer la información de cada uno. La consulta es la siguiente. Veis que no accedo a la shell MySQL sino que la ejecuto directamente desde línea de comandos bash para volcarlo a un fichero, esto me permite ahorrarme limpiar posteriormente el formato de tablas, etc:
$ mysql -u root -p -Bse "SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS query FROM mysql.user;" > grant-queries.sql
Esto me va a sacar el listado de consultas listas para ejecutar, estilo:
SHOW GRANTS FOR 'root'@'127.0.0.1'; SHOW GRANTS FOR 'foo'@'127.0.0.1'; SHOW GRANTS FOR 'bar'@'127.0.0.1'; ... ... ...
El siguiente paso es ejecutar las queries MySQL generadas en el paso anterior, podemos hacer un SOURCE contra el fichero para su ejecución y volcado posterior a otro fichero:
$ mysql -u root -p -Bse "SOURCE grant-queries.sql" > privileges.sql
El resultado es otro fichero .sql con todos los usuarios, passwords y privilegios de las bases de datos del servidor. Ya podemos ir al servidor MySQL final y volcar el SQL para restaurar todos los privilegios:
$ mysql -u root -p -Bse "SOURCE privileges.sql"