Solución 1:
No te metas con la base de datos mysql. Hay mucho más en juego allí que solo la tabla de usuarios. Su mejor apuesta es el comando "MOSTRAR SUBVENCIONES PARA". Tengo muchos alias y funciones de mantenimiento de CLI en mi .bashrc (en realidad, mis .bash_aliases que obtengo en mi .bashrc). Esta función:
mygrants()
{
mysql -B -N [email protected] -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';'
) AS query FROM mysql.user" | \
mysql [email protected] | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
El primer comando mysql usa SQL para generar SQL válido que se canaliza al segundo comando mysql. Luego, la salida se canaliza a través de sed para agregar bonitos comentarios.
El [email protected] en el comando le permitirá llamarlo como:mygrants --host=prod-db1 --user=admin --password=secret
Puede usar su kit completo de herramientas de Unix en esto así:
mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret
Esa es LA forma correcta de mover a los usuarios. Su ACL de MySQL se modifica con SQL puro.
Solución 2:
Hay dos métodos para extraer SQL Grants de una instancia de MySQL
MÉTODO #1
Puede usar pt-show-grants de Percona Toolkit
MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql
MÉTODO #2
Puedes emular pt-show-grants
con lo siguiente
MYSQL_CONN="-uroot -ppassword"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql
Cualquiera de los métodos producirá un volcado de SQL puro de las concesiones de MySQL. Todo lo que queda por hacer es ejecutar el script en un nuevo servidor:
mysql -uroot -p -A < MySQLUserGrants.sql
Pruébalo !!!
Solución 3:
La respuesta de Richard Bronosky fue extremadamente útil para mí. ¡¡¡Muchas gracias!!!
Aquí hay una pequeña variación que fue útil para mí. Es útil para transferir usuarios, p. entre dos instalaciones de Ubuntu que ejecutan phpmyadmin. Simplemente descargue los privilegios para todos los usuarios además de root, phpmyadmin y debian-sys-maint. El código es entonces
mygrants()
{
mysql -B -N [email protected] -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', host, ''';'
) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')" | \
mysql [email protected] | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
Solución 4:
O utilice percona-toolkit (antiguo maatkit) y use pt-show-grants
(o mk-show-grants
) para ese propósito. No hay necesidad de engorrosos scripts y/o procedimientos almacenados.
Solución 5:
Puede mysqldump la base de datos 'mysql' e importar a la nueva; se requerirá un flush_privileges o reiniciar y definitivamente querrá hacer una copia de seguridad de la base de datos mysq existente primero.
Para evitar eliminar sus privilegios existentes, asegúrese de agregar filas en lugar de reemplazarlas en las tablas de privilegios (db, column_priv, host, func, etc.).