Comment copier les privilèges utilisateur avec MySQL?

12

J'ai une installation MySQL avec de nombreuses bases de données et utilisateurs dont j'ai besoin pour migrer vers une nouvelle installation MySQL. Je peux utiliser phpMyAdmin pour exporter puis importer les bases de données / tables, mais je ne sais rien pour déplacer les utilisateurs et les autorisations. Comment puis-je le faire facilement?

Nathan Osman
la source

Réponses:

17

Un script comme celui-ci utilisera le client mysql cli pour imprimer une série de déclarations de subvention que vous devrez utiliser pour recréer les comptes d'utilisateurs. Cette commande fonctionnera mieux si vous avez vos informations d'identification de base de données stockées en vous .my.cnf

#!/bin/bash
# adapted from (http://www.pyrosoft.co.uk/blog/2006/10/18/show-grants-for-all-users-on-mysql/)
(
 mysql --batch --skip-column-names -e "SELECT user, host FROM user" mysql 
) | while read user host
do
  echo "# $user @ $host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
done

Si vous passez d'une version de mysql à une autre, vous voudrez peut-être l'utiliser au lieu d'un simple vidage de la base de données mysql. Le schéma de la base de données mysql est parfois mis à jour.

Cela vous permettra également de choisir les comptes que vous souhaitez recréer, s'il y a une cruauté que vous souhaitez éliminer.


J'utilisais récemment cela sur un utilisateur qui incluait des espaces dans les noms, ce qui était confus read, car IFS par défaut inclut le caractère espace comme séparateur. Ma commande nouvelle et améliorée, qui semblait fonctionner mieux sur des systèmes de noms d'utilisateur étranges.

IFS=$'\t'; while read user host; do
  echo "user:$user host:$host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
  echo ""
done < <(mysql --batch --skip-column-names -e "SELECT user, host FROM mysql.user")
Zoredache
la source
3

Cela créera un SHOW GRANTS;fichier pour chaque utilisateur.

Ensuite, faites écho à chaque utilisateur SHOW GRANTS;et ajoutez un point-virgule à chaque ligne.

MYSQL_CONN="-uroot -prootpassword"
SQLSTMT="SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';')"
SQLSTMT="${SQLSTMT} FROM mysql.user WHERE user<>''"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/ShowGrants.sql
mysql ${MYSQL_CONN} -ANe < /tmp/ShowGrants.sql | sed 's/$/;/g' > MySQLUserGrants.sql
rm -f /tmp/ShowGrants.sql

Vous pouvez également télécharger et utiliser ces outils pour faire la même chose:

Essaie !!!

RolandoMySQLDBA
la source
2

Je pense que vous devriez pouvoir migrer ces données en sauvegardant et en restaurant la mysqlbase de données.

pkaeding
la source
En particulier la table mysql.user
Coops
2
Vous devez vous assurer que les deux instances MySQL exécutent la même version principale, sinon vous devrez exécuter des scripts de mise à niveau fournis avec le serveur MySQL cible.
Maxwell