Skip to content

Instantly share code, notes, and snippets.

@serweb-labs
Last active May 7, 2024 19:05
Show Gist options
  • Save serweb-labs/422ff2dec50a2e07ab2d to your computer and use it in GitHub Desktop.
Save serweb-labs/422ff2dec50a2e07ab2d to your computer and use it in GitHub Desktop.
Migrar usuarios y privilegios de un servidor a otro

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:

Antes de insertar el fichero en el servidor, abrirlo y agregar un ";" al final de cada linea. Luego:

$ mysql -u root -p -Bse "SOURCE privileges.sql"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment