99 votes

Comment puis-je exporter les privilèges de MySQL et les importer ensuite sur un nouveau serveur ?

Je sais comment exporter/importer les bases de données à l'aide de mysqldump & c'est bien mais comment obtenir les privilèges dans le nouveau serveur.

Pour les points supplémentaires, il ya un couple de bases de données existantes sur le nouveau déjà, comment puis-je importer les privilèges des anciens serveurs sans nuking le couple existant de ceux.

Ancien serveur : 5.0.67-communauté

Nouveau serveur : 5.0.51a-24+lenny1

EDIT : J'ai un dump du db 'mysql' de l'ancien serveur et je veux maintenant savoir comment le fusionner avec le db 'mysql' du nouveau serveur.

J'ai essayé d'importer directement des données à l'aide de phpMyAdmin et je me suis retrouvé avec une erreur concernant un doublon (que j'ai déjà migré manuellement).

Quelqu'un connaît-il un moyen élégant de fusionner les deux bases de données 'mysql' ?

0 votes

1. L'utilisation de PHPMyAdmin est-elle une obligation pour vous ? Si c'est le cas, je vais écrire des instructions spécifiques à PHPMyAdmin pour vous. 2. Depuis PHPMyAdmin, si vous essayez de "select * from mysql.user limit 1 ;", obtenez-vous des résultats ou une erreur ?

1 votes

Comme je l'ai mentionné ci-dessous, je pense que mygrants script de Richard est un bon moyen d'obtenir des informations sur les subventions. Cependant, vous pouvez également essayer de modifier le fichier de vidage pour commenter les INSERTS de la table des utilisateurs pour les utilisateurs qui existent déjà. Les privilèges des bases de données restaurées à partir de l'ancien serveur seront alors copiés. Si vous avez déjà attribué manuellement des privilèges pour certains des bases de données que vous avez restaurées sur le nouveau serveur, recherchez les noms de ces tables dans les fichiers de privilèges et commentez-les également. N'oubliez pas de faire un flush_privileges par la suite. Bonne description de la base de données mysql : grahamwideman.com/gw/tech/mysql/perms/index.htm

180voto

Bruno Bronosky Points 4409

Ne pas toucher à la base de données mysql. Il y a beaucoup plus que la table des utilisateurs. Votre meilleure chance est le " SHOW GRANTS Commande "FOR". J'ai beaucoup d'alias et de fonctions de maintenance CLI dans mon .bashrc (en fait mon .bash_aliases que je source dans mon .bashrc). Cette fonction :

mygrants()
{
  mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
    'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';'
    ) AS query FROM mysql.user" | \
  mysql $@ | \
  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 acheminé vers la deuxième commande mysql. La sortie est ensuite acheminée par sed pour ajouter de jolis commentaires.

Le $@ dans la commande vous permettra de l'appeler comme : mygrants --host=prod-db1 --user=admin --password=secret

Vous pouvez utiliser votre kit complet d'outils Unix comme suit :

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é avec du SQL pur.

1 votes

Il s'agit en fait d'une fonction d'aide bash qui fonctionne très bien. Prenez la sortie de cette fonction et exécutez-la sur le nouveau serveur. Les privilèges seront saisis correctement et avec précision.

1 votes

J'adore votre fonction, aujourd'hui elle m'a épargné beaucoup de travail. Merci, merci, merci...

1 votes

J'adore. Cela m'a fait gagner au moins une heure de travail !

62voto

Adam Points 11

Il existe deux méthodes pour extraire les SQL Grants d'une Instance MySQL

MÉTHODE N° 1

Vous pouvez utiliser pt-show-grants de la boîte à outils Percona

MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql

MÉTHODE N° 2

Vous pouvez imiter pt-show-grants avec les éléments suivants

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. Tout ce qu'il reste à faire est d'exécuter le script sur un nouveau serveur :

mysql -uroot -p -A < MySQLUserGrants.sql

Essayez-le ! !!

3 votes

Pt-show-grants est exactement ce que vous voulez pour cela, cela fonctionne très bien.

0 votes

Percona est tout simplement génial.

8 votes

Mais la réponse n°2 est tout aussi bonne et fonctionnera sans logiciel supplémentaire !

15voto

NarphXCIX Points 21

La réponse de Richard Bronosky m'a été extrêmement utile. Merci beaucoup ! !!

Voici une petite variation qui m'a été utile. Elle est utile pour transférer des utilisateurs, par exemple entre deux installations Ubuntu utilisant phpmyadmin. Il suffit de supprimer les privilèges de tous les utilisateurs, à l'exception de root, phpmyadmin et debian-sys-maint. Le code est alors

mygrants()
{
mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', host, ''';'
) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')"  | \
mysql $@ | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}

3 votes

Si vous regardez mon exemple où je grep rails_admin vous pouvez déduire comment le faire sans créer une fonction spéciale pour chaque cas limite. Utilisez l'option "invert-match" de grep comme suit : mygrants --host=prod-db1 --user=admin --password=secret | grep -Ev 'root|phpmyadmin|debian-sys-maint' | mysql --host=staging-db1 --user=admin --password=secret

7voto

Ou, utilisez percona-toolkit (anciennement maatkit) et utilisez pt-show-grants (ou mk-show-grants ) à cette fin. Pas besoin de scripts encombrants et/ou de procédures stockées.

6voto

nedm Points 5600

Vous pouvez mysqldump 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 sauvegarder la base de données mysq existante d'abord.

Pour éviter de supprimer vos privilèges existants, veillez à ajouter plutôt qu'à remplacer des lignes dans les tables de privilèges (db, columns_priv, host, func, etc.).

0 votes

Merci @nedm. Il semble que l'ennuyeux serveur cPanel sur lequel j'essaie de récupérer les dbs ne montre pas le db 'mysql'. Sinon, j'aurais testé et confirmé votre réponse. Une fois que j'aurai trouvé cette solution, je reviendrai vous voir. Merci.

0 votes

C'est malheureux mais compréhensible, vous êtes probablement empêché d'accéder à toutes les bases de données sauf celles qui appartiennent directement à votre utilisateur sur une base de données partagée.

0 votes

Aïe, oui, sans accès à 'mysql', il sera difficile de faire quoi que ce soit concernant les utilisateurs ou les permissions. Avez-vous un accès en ligne de commande ? Pouvez-vous exécuter mysqldump à partir du terminal ou de la ligne de commande (PAS à partir de mysql Shell) ? mysqldump -u nomutilisateur -ppassword mysql > mysqldump.sql

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X