Hoe te exporteren & Bestaande gebruiker importeren (met zijn rechten!)

Ik heb een bestaande MySQL-instantie (test), die 2 databases bevat en een paar gebruikers die elk verschillende toegangsrechten hebben voor elke database.

Ik moet nu een van de databases dupliceren (in productie) en de gebruikersdie eraan gekoppeld zijn.

Het dupliceren van de database was eenvoudig:

Exporteren:

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

Importeren:

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

Ik heb echter geen eenvoudige manier gevonden om gebruikerste exporteren en importeren vanaf de opdrachtregel(binnen of buiten mysql).

Hoe exporteer en importeer ik een gebruikervanaf de opdrachtregel?


Update: tot nu toe heb ik handmatige (en dus foutgevoelige) stappen gevonden om dit te bereiken:

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

Zoek vervolgens de subsidies:

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

Vervolgens handmatigmaak je een gebruiker aan met de subsidies die worden vermeld in het resultaat van de opdracht ‘show grants’ hierboven.

Ik geef de voorkeur aan een veiligere, meer geautomatiseerde manier. Is er een?


Antwoord 1, autoriteit 100%

Een van de gemakkelijkste manieren die ik heb gevonden om gebruikers te exporteren, is het gebruik van Percona’s tool pt-show-grants. De Percona-toolkit is gratis, eenvoudig te installeren en gebruiksvriendelijk, met veel documentatie.
Het is een gemakkelijke manier om alle gebruikers of specifieke gebruikers te tonen. Het geeft een overzicht van al hun subsidies en outputs in SQL-indeling. Ik zal een voorbeeld geven van hoe ik alle subsidies voor test_user zou tonen:

shell> pt-show-grants --only test_user

Voorbeelduitvoer van dat commando:

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

Meestal herleid ik de uitvoer naar een bestand zodat ik kan bewerken wat ik nodig heb, of laad het in mysql.

Als u de Percona-tool niet wilt gebruiken en alle gebruikers wilt dumpen, kunt u ook mysqldump op deze manier gebruiken:

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

Opmerking: –flush-privileges werken hier niet mee, omdat de hele db niet wordt gedumpt. dit betekent dat u het handmatig moet uitvoeren.

shell> mysql -e "FLUSH PRIVILEGES"

Antwoord 2, autoriteit 45%

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

Bovenstaand script wordt uitgevoerd in een linux-omgeving en de uitvoer is user_privileges_final.sql die u kunt importeren in een nieuwe mysql-server waar u gebruikersrechten wilt kopiëren.

UPDATE: er ontbrak een -voor de gebruiker van de 2e mysql-instructie.


Antwoord 3, autoriteit 13%

Nog een bash one-liner voor linux die je kunt gebruiken in plaats van de Percona-tool:

mysql -u<user> -p<password> -h<host> -N mysql -e "select concat(\"'\", user, \"'@'\", host, \"'\"), coalesce(password, 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

Antwoord 4, autoriteit 6%

Als aanvulling op het antwoord van @Sergey-Podushkin, werkt deze shellscriptcode voor mij:

mysql -u<user> -p<password> -N mysql -e "select concat(\"'\", user, \"'@'\", host, \"'\"), authentication_string from user where not user like 'root'" | while read usr pw ; do mysql -u<user> -p<password> -N -e "SHOW GRANTS FOR $usr" | sed 's/\(\S\)$/\1;/'; done 

Antwoord 5, autoriteit 2%

PhpMyAdminU kunt phpMyAdmin gebruiken.

Log in en ga naar uw database of een tabel waar de gebruiker toegang heeft.

Bevoegdheden selecteren

Alle gebruikers met toegang zijn aanwezig.

Selecteer Exporteren. En er is een klein venster met alle SUBSIDIES klaar om te kopiëren en plakken.


Antwoord 6, autoriteit 2%

Dit is wat ik tegenwoordig gebruik als onderdeel van mijn dagelijkse back-upscripts (vereist root-shell en MySQL-toegang, linux-shell en gebruikt het ingebouwde mysql-schema:

Eerst maak ik een bestand /var/backup/mysqlroot.cnf met het root-wachtwoord zodat ik mijn scripts kan automatiseren en geen wachtwoorden erin kan coderen:

[client]
password=(put your password here)

Vervolgens maak ik een exportscript dat dumpt om gebruikerscommando’s en toekenningen als volgt te maken:

touch /var/backup/backup_sql.sh
chmod 700 /var/backup/backup_sql.sh
vi /var/backup/backup_sql.sh

En schrijf dan de volgende inhoud:

#!/bin/bash
mysql --defaults-extra-file=/var/backup/mysqlroot.cnf -sNe " \
  SELECT \
    CONCAT( 'CREATE USER \'', User, '\'@\'', Host, '\' IDENTIFIED BY \'', authentication_string, '\'\;' ) AS User \
  FROM mysql.user \
  WHERE \
    User NOT LIKE 'mysql.%' AND CONCAT( User, Host ) <> 'rootlocalhost' AND User <> 'debian-sys-maint' \
"
mysql --defaults-extra-file=/var/backup/mysqlroot.cnf -sNe " \
  SELECT \
    CONCAT( '\'', User, '\'@\'', Host, '\'' ) as User FROM mysql.user \
  WHERE \
    User NOT LIKE 'mysql.%' \
    AND CONCAT( User, Host ) <> 'rootlocalhost' \
    AND User <> 'debian-sys-maint' \
" | sort | while read u ; 
 do echo "-- $u"; mysql --defaults-extra-file=/var/backup/mysqlroot.cnf -sNe "show grants for $u" | sed 's/$/;/'
done

Vervolgens moet ik het als volgt uitvoeren:
/var/backup/backup_sql.sh > /tmp/exportusers.sql


Antwoord 7, autoriteit 2%

Een PHP-script om over uw gebruikers te lopen om de toekenningsopdrachten te krijgen, zou als volgt zijn:

// 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();
    while ($row2 = $statement2->fetch())
    {
        $export[] = $row2[0];
    }
}
$link = null;
echo implode(";\n", $export);

Samenvatting: https://gist.github.com/zaiddabaeen/e88a2d10528e31cd6692


Antwoord 8, autoriteit 2%

In mysql 5.7 en later kunt u dit gebruiken.

mysqlpump -uroot -p${yourpasswd} --exclude-databases=% --users

Dit genereert een uitvoer in sql-indeling die u kunt omleiden naar mysql_users.sql.

Merk op dat het mysqlpumpis en niet mysqldump.


9

Pass = your_password_here; \
  MySQL_PWD = $ PASS MYSQL -B -N-DEROOT -E "Selecteer Concat ('\' ', Gebruiker,' \ '', '\' ', host,' \ '', '\' ', authentication_string,' \ '', '\' ', plug-in', '\' ') van MySQL.User waar gebruiker! =' Debian-Sys-Maint 'en gebruiker! =' Root 'en gebruiker! =' mysql.sys 'en gebruiker! = 'MySQL.SESSIE' EN GEBRUIKER! = '' '& GT; mysql_all_users.txt; \
  terwijl leeslijn; do linearray = ($ {line}); \
  MySQL_PWD = $ PASS MYSQL -B -N-DEROOT -E "Selecteer Concat ('Gebruiker maken \' ', $ {linearray [0]},' \ '@ \' ', $ {linearray [1]},' \ ' 'Geïdentificeerd met \' ', $ {linearray [3]},' \ 'als \' ', $ {linearray [2]},' \ '') "; \
    gedaan & lt; mysql_all_users.txt & gt; MySQL_ALL_USERS_SQL.SQL; \
  terwijl leeslijn; do linearray = ($ {line}); \
  MySQL_PWD = $ PASS MYSQL -B -N-DEROOT -EE "Toon subsidies voor $ {linearray [0]} @ $ {linearray [1]}"; \
    gedaan & lt; mysql_all_users.txt & gt; & gt; MySQL_ALL_USERS_SQL.SQL; \
  sed -e's / $ /; / '-i mysql_all_users_sql.sql; \
  echo 'flush-privileges;' & GT; & GT; MySQL_ALL_USERS_SQL.SQL; \
  unset pass

First MySQL-opdracht: exporteer alle gebruikers naar bestand en sluit er wat uit.
Second MySQL-opdracht: Loop-gebruikers uit het bestand om een ​​SQL-opdracht ‘Gebruiker maken’ te schrijven naar een geëxporteerd bestand (met authentication-inloggegevens).
Derde MySQL-opdracht: Loop-gebruikers uit het bestand om hun privileges aan het geëxporteerde bestand toe te voegen.
sed commando om een ​​”;” te voegen tot einde van lijnen en flush-privileges om te eindigen.
Om te importeren: MySQL_PWD = $ PASS MYSQL -U Root & LT; MySQL_ALL_USERS_SQL.SQL

Other episodes