systemadmin.es > DBA > Obtener los GRANTs de una base de datos MySQL

Obtener los GRANTs de una base de datos MySQL

En la base de datos llamada mysql encontramos todo lo relacionado con los privilegios de los usuarios, por lo que al migrar de base de datos nos la podríamos llevar tal cual, pero nos llevaremos mucho más que los GRANTs. Vamos a ver como hacer un dump de los GRANTs de una base de datos MySQL.

Mediante el comando SHOW GRANTS FOR podemos ver los privilegios del usuario que queramos, por ejemplo:

mysql> SHOW GRANTS FOR jordi@localhost;
+--------------------------------------------------------------------------------------------------------------+
| Grants for jordi@localhost                                                                                   |
+--------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'jordi'@'localhost' IDENTIFIED BY PASSWORD '*5F0BC1E1BDE9290CA60BCAC2CED38113A7DEB6C2' | 
| GRANT ALL PRIVILEGES ON `test`.* TO 'jordi'@'localhost'                                                      | 
| GRANT ALL PRIVILEGES ON `jordi`.* TO 'jordi'@'localhost'                                                     | 
+--------------------------------------------------------------------------------------------------------------+
3 rows in set (0.01 sec)

Si esto lo combinamos con una query a la tabla user de la base de datos mysql podemos obtener todos los GRANTs de todos los usuarios creando las consultas con MySQL y volviéndolas a pasar al MySQL. Vamos a ver los pasos:

Primero generamos los SHOW GRANTS con una query a la base de datos MySQL:

mysql> SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') FROM mysql.user;
+----------------------------------------------------------+
| CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') |
+----------------------------------------------------------+
| SHOW GRANTS FOR 'root'@'127.0.0.1';                      |
(...)
+----------------------------------------------------------+
10 rows in set (0.01 sec)

Esta query simplemente concatenamos el texto que nos interesa (SHOW GRANTS FOR) con el resultado de obtener los usuarios y los hosts origen de mysql.user. Con el resultado de esta query obtenemos las queries que nos interesan, por lo que sólo debemos volverlas a passar al MySQL. Si lo hacemos con una pipe obtenemos los resultados pero con el título de la columna:

# echo "SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') FROM mysql.user;" | mysql
CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';')
SHOW GRANTS FOR 'root'@'127.0.0.1';
(..)

Mediante -N podemos hacer que sólo nos devuelva los resultados:

# echo "SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') FROM mysql.user;" | mysql -N
SHOW GRANTS FOR 'root'@'127.0.0.1';
(...)

Dichas queries las volvemos a pasar al MySQL para obtener el listado de GRANTS:

# echo "SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') FROM mysql.user;" | mysql -N | mysql -N
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD '*5F0BC1E1BDE9290CA60BCAC2CED38113A7DEB6C2' WITH GRANT OPTION
(...)

Para poder pegarlos directamente a otro sistema deberemos añadir el punto y coma final, podemos hacerlo con un simple sed:

# echo "SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') FROM mysql.user" | mysql -N | mysql -N | sed 's/$/;/' 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD '*5F0BC1E1BDE9290CA60BCAC2CED38113A7DEB6C2' WITH GRANT OPTION;

Así nos estaremos llevando los privilegios de los usuarios de una forma más limpia que con un mysqldump de mysql.user y mysql.db ya que tenemos los comandos SQL para asignar los privilegios independientemente de la estructura de dichas tablas.

3 comments to “Obtener los GRANTs de una base de datos MySQL”

  1. Muy bueno!!
    Si puedo poner un pero, es que para que funcione, debe estar permitido el login del usuario root@localhost sin contraseña en mysql.

    S2

  2. En realidad no, puedes usar usuario y contraseña mediante las opciones -u y -p del cliente de mysql.

    Yo normalmente tengo un alias definido:

    alias mysql='mysql -u root -p$(cat /var/mysql/.mysql.root.pass)
    

    Dentro de /var/mysql/.mysql.root.pass le dejo el password con permisos 600

  3. OK, perfecto, pues.
    A mi no me funcionaba porque si no lo defines en el alias como has indicado los dos “mysql -N” concatenados no dejaban logarse adecuadamente.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>