web-dev-qa-db-fra.com

Comment exporter et importer un utilisateur existant (avec ses privilèges!)

J'ai une instance existante de MySQL (test), contenant 2 bases de données et quelques utilisateurs ayant chacun des privilèges d'accès différents pour chaque base de données.

Je dois maintenant dupliquer l'une des bases de données (en production) et les utilisateurs qui lui sont associées.

La duplication de la base de données était facile :

Exportation:

mysqldump --no-data --tables -u root -p secondb >> secondb_schema.sql

Importation:

mysql -u root -p -h localhost secondb < secondb_schema.sql

Je n'ai cependant pas trouvé de moyen simple d'exporter et d'importer utilisateurs à partir de la ligne de commande (à l'intérieur ou à l'extérieur de mysql).

Comment exporter et importer un utilisateur à partir de la ligne de commande?


Mise à jour: Jusqu'à présent, j'ai trouvé les étapes manuelles (et donc sujettes aux erreurs) pour accomplir ceci:

-- lists all users
select user,Host from mysql.user;

Alors retrouvez ses subventions:

-- find privilege granted to a particular user
show grants for 'root'@'localhost'; 

Ensuite, manuellement créez un utilisateur avec les droits énumérés dans le résultat de la commande 'afficher les droits' ci-dessus. 

Je préfère un moyen plus sûr et plus automatisé. Est-ce qu'il y a un?

30
Withheld

L'un des moyens les plus simples que j'ai trouvés d'exporter des utilisateurs consiste à utiliser l'outil pt-show-grants de Percona. La boîte à outils Percona est gratuite, facile à installer et à utiliser, avec beaucoup de documentation . C'est un moyen facile de montrer à tous les utilisateurs, ou des utilisateurs spécifiques. Il répertorie toutes leurs subventions et leurs résultats au format SQL. Je vais donner un exemple de la façon dont je montrerais toutes les subventions pour test_user:

Shell> pt-show-grants --only test_user

Exemple de résultat de cette commande:

GRANT USAGE ON *.* TO 'test_user'@'%' IDENTIFIED BY PASSWORD '*06406C868B12689643D7E55E8EB2FE82B4A6F5F4';
GRANT ALTER, INSERT, LOCK TABLES, SELECT, UPDATE ON `test`.* TO 'test_user'@'%';

Je redérige habituellement la sortie dans un fichier afin de pouvoir éditer ce dont j'ai besoin, ou de le charger dans mysql.

Sinon, si vous ne voulez pas utiliser l'outil Percona et que vous voulez faire un dump de tous les utilisateurs, vous pouvez utiliser mysqldump de cette façon:

Shell> mysqldump mysql --tables user db > users.sql

Remarque: --flush-privileges ne fonctionnera pas avec cela, car la base de données ne sera pas entièrement sauvegardée. cela signifie que vous devez l'exécuter manuellement.

Shell> mysql -e "FLUSH PRIVILEGES"
29
Matthew Carey
mysql -u<user> -p<password> -h<Host> -e"select concat('show grants for ','\'',user,'\'@\'',Host,'\'') from mysql.user" > user_list_with_header.txt
sed '1d' user_list_with_header.txt > ./user.txt
while read user; do  mysql u<user> -p<password> -h<Host> -e"$user" > user_grant.txt; sed '1d' user_grant.txt >> user_privileges.txt; echo "flush privileges" >> user_privileges.txt; done < user.txt
awk '{print $0";"}'  user_privileges.txt >user_privileges_final.sql
rm user.txt user_list_with_header.txt user_grant.txt user_privileges.txt

Le script ci-dessus s'exécutera dans un environnement linux et la sortie sera user_privileges_final.sql que vous pourrez importer dans le nouveau serveur mysql où vous souhaitez copier les privilèges de l'utilisateur.

18
Vardan Gupta

Encore un autre bash one-liner pour linux à utiliser à la place de l’outil Percona:

mysql -u<user> -p<password> -h<Host> -N mysql -e "select concat(\"'\", user, \"'@'\", Host, \"'\"), authentication_string from user where not user like 'mysql.%'" | while read usr pw ; do echo "GRANT USAGE ON *.* TO $usr IDENTIFIED BY PASSWORD '$pw';" ; mysql -u<user> -p<password> -h<Host> -N -e "SHOW GRANTS FOR $usr" | grep -v 'GRANT USAGE' | sed 's/\(\S\)$/\1;/' ; done
1
Sergey Podushkin

Un script PHP permettant de passer en boucle sur vos utilisateurs pour obtenir les commandes d'octroi serait en tant que tel:

// Set up database root credentials
$Host = 'localhost';
$user = 'root';
$pass = 'YOUR PASSWORD';
// ---- Do not edit below this ----
// Misc settings
header('Content-type: text/plain; Charset=UTF-8');
// Final import queries goes here
$export = array();
// Connect to database
try {
    $link = new PDO("mysql:Host=$Host;dbname=mysql", $user, $pass);
} catch (PDOException $e) {
    printf('Connect failed: %s', $e->getMessage());
    die();
}

// Get users from database
$statement = $link->prepare("select `user`, `Host`, `password` FROM `user`");
$statement->execute();
while ($row = $statement->fetch())
{
    $user   = $row[0];
    $Host   = $row[1];
    $pass   = $row[2];
    $export[] = 'CREATE USER \''. $user .'\'@\''. $Host .'\' IDENTIFIED BY \''. $pass .'\'';
    // Fetch any permissions found in database
    $statement2 = $link->prepare('SHOW GRANTS FOR \''. $user .'\'@\''. $Host .'\'');
    $statement2->execute();
    if ($row2 = $statement2->fetch())
    {
        $export[] = $row2[0];
    }
}

$link = null;
echo implode(";\n", $export);

Gist: https://Gist.github.com/zaiddabaeen/e88a2d10528e31cd6692

0
zed

PhpMyAdmin Vous pouvez utiliser phpMyAdmin.

Connectez-vous et accédez à votre base de données ou à une table à laquelle l'utilisateur a accès.

Sélectionnez les privilèges

Tous les utilisateurs ayant accès sont là.

Sélectionnez Exporter. Et une petite fenêtre avec toutes les bourses est prête à être copiée et collée.

0
Mysql MariaDB

J'ai eu le même problème. La solution est qu'après l'importation de la sauvegarde, vous devez effectuer un "privilège de vidage;". Ensuite, les privilèges des utilisateurs seront actifs comme dans la base de données d'origine.

ALORS 

mysql -u racine -p -h localhost secondb <secondb_schema.sql

mysql -u root; puis dans mysql: "flush privileges;"

0
HadTheSameProblem

Je me suis attaqué à cela avec un petit programme C #. Il existe un code pour générer un script ou appliquer les subventions directement de la source à la destination. Si vous effectuez un portage depuis un environnement Windows -> * nix, vous devrez peut-être tenir compte de problèmes de sensibilité à la casse. 

using System;
using MySql.Data.MySqlClient;
using System.Configuration;
using System.IO;
using System.Collections.Generic;

namespace GenerateUsersScript
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> grantsQueries = new List<string>();

            // Get A Show Grants query for each user
            using (MySqlConnection sourceConn = OpenConnection("sourceDatabase"))
            {
                using (MySqlDataReader usersReader = GetUsersReader(sourceConn))
                {
                    while (usersReader.Read())
                    {
                        grantsQueries.Add(String.Format("SHOW GRANTS FOR '{0}'@'{1}'", usersReader[0], usersReader[1]));
                    }
                }

                Console.WriteLine("Exporting Grants For {0} Users", grantsQueries.Count);

                using (StreamWriter writer = File.CreateText(@".\UserPermissions.Sql"))
                {
                    // Then Execute each in turn 
                    foreach (string grantsSql in grantsQueries)
                    {
                        WritePermissionsScript(sourceConn, grantsSql, writer);
                    }

                    //using (MySqlConnection destConn = OpenConnection("targetDatabase"))
                    //{
                    //    MySqlCommand command = destConn.CreateCommand();

                    //    foreach (string grantsSql in grantsQueries)
                    //    {
                    //        WritePermissionsDirect(sourceConn, grantsSql, command);
                    //    }
                    //}
                }
            }

            Console.WriteLine("Done - Press A Key to Continue");

            Console.ReadKey();
        }

        private static void WritePermissionsDirect(MySqlConnection sourceConn, string grantsSql, MySqlCommand writeCommand)
        {
            MySqlCommand cmd = new MySqlCommand(grantsSql, sourceConn);

            using (MySqlDataReader grantsReader = cmd.ExecuteReader())
            {
                while (grantsReader.Read())
                {
                    try
                    {
                        writeCommand.CommandText = grantsReader[0].ToString(); 

                        writeCommand.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(grantsReader[0].ToString());

                        Console.WriteLine(ex.Message);
                    }
                }
            } 
        }

        private static void WritePermissionsScript(MySqlConnection conn, string grantsSql, StreamWriter writer)
        {
            MySqlCommand command = new MySqlCommand(grantsSql, conn);

            using (MySqlDataReader grantsReader = command.ExecuteReader())
            {
                while (grantsReader.Read())
                {
                    writer.WriteLine(grantsReader[0] + ";");
                }
            }

            writer.WriteLine();
        }

        private static MySqlDataReader GetUsersReader(MySqlConnection conn)
        {
            string queryString = String.Format("SELECT User, Host FROM USER");
            MySqlCommand command = new MySqlCommand(queryString, conn);
            MySqlDataReader reader = command.ExecuteReader();
            return reader;
        }

        private static MySqlConnection OpenConnection(string connName)
        {
            string connectionString = ConfigurationManager.ConnectionStrings[connName].ConnectionString;
            MySqlConnection connection = new MySqlConnection(connectionString);
            connection.Open();
            return connection; 

        }
    }
}

avec un app.config contenant ...

    <connectionStrings>
        <add name="sourceDatabase" connectionString="server=localhost;user id=hugh;password=xxxxxxxx;persistsecurityinfo=True;database=MySql" />
        <add name="targetDatabase" connectionString="server=queeg;user id=hugh;password=xxxxxxxx;persistsecurityinfo=True;database=MySql" />
    </connectionStrings> 
0
Hugh Jones