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

5voto

Lenny Points 51

Vous pouvez également le faire en tant que procédure stockée :

CREATE PROCEDURE spShowGrants()
    READS SQL DATA
    COMMENT 'Show GRANT statements for users'
BEGIN
    DECLARE v VARCHAR(64) CHARACTER SET utf8;
    DECLARE c CURSOR FOR
    SELECT DISTINCT CONCAT(
        'SHOW GRANTS FOR ', user, '@', host, ';'
    ) AS query FROM mysql.user;
    DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;  
    OPEN c;
    WHILE TRUE DO
        FETCH c INTO v;
        SET @v = v;
        PREPARE stmt FROM @v;
        EXECUTE stmt;
    END WHILE;
    CLOSE c;
END

et le suivre avec

$ mysql -p -e "CALL spShowGrants" mysql

puis passer la sortie par la commande Richards sed pour obtenir une sauvegarde des privilèges.

5voto

Ibrahim Lawal Points 151

Pourquoi pas un script PHP ? :)

Visualisez la source de ce script et vous aurez tous les privilèges listés :

//connect
mysql_select_db("mysql", mysql_connect("localhost","root",""));

//create grants select statements
$rs = mysql_query("SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS query FROM user");

//iterate through grants
while ($row=mysql_fetch_array($rs)) {
    //run grant query
    $rs2 = mysql_query($row['query']);
    //iterate through results
    while($row2 = mysql_fetch_array($rs2)){
        //print results
        echo $row2[0] . ";\n\n";
    }
}

3voto

Shadezguy Points 141

Bien qu'il semble que la réponse de @Richard Bronosky soit la bonne, j'ai rencontré cette question après avoir essayé de migrer un ensemble de bases de données d'un serveur à un autre et la solution était beaucoup plus simple :

server1$ mysqldump -u root -p --all-databases > dbdump.sql

server2$ mysql -u root -p < dbdump.sql

A ce stade, toutes mes données étaient visibles si je me connectais en tant que root le mysql.user contenait tout ce à quoi je m'attendais, mais je n'ai pas pu me connecter en tant qu'autre utilisateur et j'ai trouvé cette question supposant que je devais ré-émettre l'autorisation d'accès au site. GRANT déclarations.

Cependant, il s'avère que le serveur mysql a simplement dû être redémarré pour que les privilèges mis à jour dans le fichier mysql.* pour prendre effet :

server2$ sudo restart mysql

J'espère que cela aidera quelqu'un d'autre à accomplir ce qui devrait être une tâche simple !

0 votes

Oh, et ma situation était légèrement différente de celle de l'OP, dans la mesure où je n'essayais pas de fusionner un dump dans un serveur avec des bases de données/utilisateurs existants.

2 votes

Il n'est pas nécessaire de redémarrer MySQLd pour "mettre à jour les privilèges". Cela peut être fait avec la commande MySQL "flush privileges ;".

0 votes

Le problème de cette approche est qu'elle ne fonctionne que lorsque les versions de MySQL de la source et de la destination sont les mêmes. Sinon, vous risquez d'avoir des problèmes parce que la table mysql.user source a des colonnes différentes de la table mysql.user destination, par exemple.

2voto

créer un fichier Shell Shell avec le code suivant :

##############################################3

echo "SELECT DISTINCT CONCAT (\"show grants for '\", user, \"'@'\", host, \"';\") AS query FROM mysql.user; " >   script.sql    
echo "*** You will be asked to enter the root password twice ******"    
mysql -u root -p  < script.sql > output.sql ;    
cat output.sql | grep show > output1.sql  ; rm output.sql -f ; 
mysql -u root -p  < output1.sql > output.sql ;
clear
echo "-----Exported Grants-----"    
cat  output.sql ; rm  output.sql   output1.sql -f    
echo "-------------------------"
rm  script.sql -f

#

****puis exécutez-le sur le Shell comme ceci : il vous sera demandé de saisir deux fois le mot de passe root, puis le SQL GRANTS s'affichera à l'écran.****

0voto

sjas Points 305

Une seule ligne qui fait à peu près la même chose que la géniale pt-show-grants :

mysql --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql --skip-column-names -A | sed 's/$/;/g'

Basé uniquement sur des outils unix, aucun logiciel supplémentaire n'est nécessaire.

Exécuter à l'intérieur d'un Shell bash, en supposant que vous avez un travail .my.cnf où le mot de passe de votre mysql root l'utilisateur peut être lu.

0 votes

J'ai dupliqué la moitié du message de @rolandomysqldba après être revenu six mois plus tard, je viens de le réaliser.

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