Solution 1 :
Ne plaisante pas avec la base de données mysql. Il s'y passe bien plus que la simple table des utilisateurs. Votre meilleur pari est la commande "AFFICHER LES SUBVENTIONS POUR". J'ai beaucoup d'alias et de fonctions de maintenance CLI dans mon .bashrc (en fait mes .bash_aliases que je source dans mon .bashrc). Cette fonction :
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;}'
}
La première commande mysql utilise SQL pour générer du SQL valide qui est redirigé vers la deuxième commande mysql. La sortie est ensuite redirigée vers sed pour ajouter de jolis commentaires.
L'[email protected] dans la commande vous permettra de l'appeler comme suit :mygrants --host=prod-db1 --user=admin --password=secret
Vous pouvez utiliser votre kit d'outils Unix complet comme ceci :
mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret
C'est LA bonne façon de déplacer les utilisateurs. Votre ACL MySQL est modifiée avec du SQL pur.
Solution 2 :
Il existe deux méthodes pour extraire les subventions SQL d'une instance MySQL
MÉTHODE #1
Vous pouvez utiliser pt-show-grants de Percona Toolkit
MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql
MÉTHODE #2
Vous pouvez émuler pt-show-grants
avec ce qui suit
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
L'une ou l'autre méthode produira un vidage SQL pur des subventions MySQL. Il ne reste plus qu'à exécuter le script sur un nouveau serveur :
mysql -uroot -p -A < MySQLUserGrants.sql
Essayez-le !!!
Solution 3 :
La réponse de Richard Bronosky m'a été extrêmement utile. Merci beaucoup !!!
Voici une petite variante qui m'a été utile. Il est utile pour transférer des utilisateurs, par ex. entre deux installations Ubuntu exécutant phpmyadmin. Videz simplement les privilèges de tous les utilisateurs à l'exception de root, phpmyadmin et debian-sys-maint. Le code est alors
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;}'
}
Solution 4 :
Ou, utilisez percona-toolkit (ancien maatkit) et utilisez pt-show-grants
(ou mk-show-grants
) Dans ce but. Pas besoin de scripts encombrants et/ou de procédures stockées.
Solution 5 :
Vous pouvez mysqldumper la base de données 'mysql' et l'importer dans la nouvelle; un flush_privileges ou un redémarrage sera nécessaire et vous voudrez certainement d'abord sauvegarder la base de données mysq existante.
Pour éviter de supprimer vos privilèges existants, assurez-vous d'ajouter plutôt que de remplacer des lignes dans les tables de privilèges (db, columns_priv, host, func, etc.).