2014-05-07 17 views
18

Mam istniejącą instancję MySQL (test), zawierającą 2 bazy danych i kilku użytkowników, z których każdy ma różne uprawnienia dostępu do każdej bazy danych.Jak eksportować i importować istniejącego użytkownika (z jego uprawnieniami!)

Muszę teraz powielić jedną z baz danych (do produkcji) i użytkowników z tym związanych.

powielenie bazie było easy:

Export:

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

importu:

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

nie znalazłem jednak prosty sposób eksportować i importować użytkowników , z linii poleceń (wewnątrz lub na zewnątrz mysql).

Jak wyeksportować i zaimportować user z wiersza poleceń?


Aktualizacja: Do tej pory znalazłem manual (a więc podatne na błędy) kroki zmierzające do osiągnięcia tego:

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

następnie znaleźć jej udziela:

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

Następnie ręcznie utwórz użytkownika z grantami wymienionymi w wyniku polecenia "pokaż granty" powyżej.

Wolę bezpieczniejszy, bardziej zautomatyzowany sposób. Czy jest jeden?

+0

Najlepszą odpowiedzią jest rzeczywiście na ServerFault: http://serverfault.com/a/399875 – pors

Odpowiedz

14

Jednym z najprostszych sposobów, w jaki znalazłem wyeksportowanie użytkowników, jest użycie narzędzia Per -ona pt-show-grant. Zestaw narzędzi Percona jest bezpłatny, łatwy w instalacji i łatwy w obsłudze, z dużą ilością dokumentacji. To łatwy sposób na pokazanie wszystkich użytkowników lub określonych użytkowników. Wymienia wszystkie granty i wyniki w formacie SQL. Podam przykład w jaki sposób mogę wyświetlić wszystkie dotacje na test_user:

shell> pt-show-grants --only test_user 

Przykâadowa tego polecenia:

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

zwykle rederict wyjście do pliku, więc mogę zmieniać co ja potrzebujesz lub załaduj go do mysql.

Ewentualnie, jeśli nie chcesz używać narzędzia Percona i chcesz zrobić zrzut wszystkich użytkowników, można użyć mysqldump w ten sposób:

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

Uwaga: --flush-przywileje wygrał nie działa z tym, ponieważ cała baza danych nie jest zrzucana. oznacza to, że musisz uruchomić go ręcznie.

shell> mysql -e "FLUSH PRIVILEGES" 
+1

narzędzia Pobierz zawierające PT-show-dotacje z [tutaj] (https://www.percona.com/downloads/percona-toolkit/NAJNOWSZE /), Doc to [tutaj] (https://www.percona.com/doc/percona-toolkit/LATEST/pt-show-grants.html) – robsch

11
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 

Przede skrypt będzie działał w środowisku Linux i wyjście będzie user_privileges_final.sql, który można zaimportować na nowym serwerze mysql, na którym chcesz skopiować uprawnienia użytkownika.

+1

Istnieje wiele "przywilejów do korzystania z puli" ; 'puste linie, ale działa. Dzięki! –

+1

czysta magia! uratowałeś mój dzień –

+1

bardzo chciałem uruchomić ten (trudny do odczytania skrypt), ale zadziałało, kudos! – TimeWaster

0

Rozwiązałem to z małym programem C#. Jest tutaj kod generujący skrypt lub stosujący dotacje bezpośrednio od źródła do miejsca przeznaczenia. W przypadku portowania ze środowiska Windows -> * nix może być konieczne rozważenie problemów z rozróżnianiem wielkości liter.

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; 

     } 
    } 
} 

z app.config zawierającego ...

<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

skrypt PHP do pętli nad swoim użytkownikom na polecenia przyznanie byłoby jako takie:

// 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

Kolejny bash linux do użycia zamiast narzędzia 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 
Powiązane problemy