# rm-rf.es

Migrar privilegios de un servidor MySQL

Los privilegios de MySQL se pueden migrar de varias formas, una de ellas es básicamente exportar e importar la base de datos «mysql» de un servidor a otro. Si no queremos sobreescribir ciertas tablas o registros, lo mejor es ceñirnos únicamente a lo que nos interesa, en este caso los usuarios, passwords y la relación de privilegios para cada una de las bases de datos y tablas del servidor MySQL.

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"
Salir de la versión móvil