Migrar privilegios de un servidor MySQL

MySQLLos 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"

3 comentarios en “Migrar privilegios de un servidor MySQL

  1. a mi me da error siguiendo los pasos tal cual

    ERROR 1064 (42000) at line 1 in file: ‘privileges.sql’: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CR’ at line 2

  2. Me vino bien el manual pero omite algo MUY importante; tienes que hacer un flush privileges para que «se apliquen los cambios».

    Esto que es algo evidente, cuando estás metido en saltos a producción puede pasársete

    Un saludo y gracias de todas formas

Comments are closed.