Sichern / Wiederherstellen von Benutzern / Kennwörtern / Berechtigungen

16

Ich wechsle von einem Server auf einen anderen und möchte alle Datenbanken + Benutzer / Berechtigungen / Kennwörter von meinem MySQL-Server sichern. Ich habe festgestellt, dass eine Datenbank mit gesichert mysqldumpwurde, kann aber nicht herausfinden, wie alle Benutzer und die angegebenen Berechtigungen gesichert werden. Gibt es eine Möglichkeit, dies zu erreichen, oder muss ich dies auf dem neuen Server neu einrichten?

Nidhoegger
quelle
Verschieben Sie die Daten auf einen anderen Server, auf dem dieselbe MySQL-Version ausgeführt wird?
RolandoMySQLDBA

Antworten:

16

Die 'mysql'-Datenbank enthält Benutzer / Berechtigungen / Kennwörter. Nehmen Sie also den Speicherauszug der MySQL-Datenbank zusammen mit anderen Datenbanken

mysqldump [options] --all-databases > all_databases_dump.sql

mysqldump -u root -p mysql user > user_table_dump.sql

Diese MySQL-Datenbanktabellen enthalten Grant-Informationen

user: Benutzerkonten, globale Berechtigungen und andere Spalten ohne Berechtigungen.

db: Berechtigungen auf Datenbankebene.

tables_priv: Berechtigungen auf Tabellenebene.

columns_priv: Berechtigungen auf Spaltenebene .

procs_priv: Berechtigungen für gespeicherte Prozeduren und Funktionen.

Nach Wiederherstellung mit abgleichen

select Host, user, password from user ;

SHOW GRANTS FOR 'user'@'localhost';
Koustuv Chatterjee
quelle
7
Vorsicht. Wenn Sie dies in eine neuere Version von MySQL laden, schlägt der Speicherauszug von mysql.usermöglicherweise aufgrund von Schemaänderungen fehl.
Rick James
1
@ RickJames: Was sollen wir tun, wenn wir auf eine neuere Version migrieren und die Benutzer wiederherstellen möchten?
brunoqc
1
mysql_upgradeist ein Skript, mit dem Schemaänderungen vorgenommen werden können. Es wird jedoch davon ausgegangen, dass Sie jeweils nur eine wesentliche Änderung vornehmen und nicht erneut laden. Erforsche es. (Entschuldigung, ich habe keine Erfahrung im Bereich Upgrades.)
Rick James
1
Nach dem Wiederherstellen müssen Sie möglicherweise / werden auch flush privileges;auf dem neuen MySQL. Auf mysql -u root -p -e'flush privileges;' diese Weise kann / wird Ihr Root-MySQL-Passwort auf Ihrem neuen Server auch als Root-Passwort von Ihrem alten Server festgelegt. Stellen Sie also sicher, dass Sie wissen, was das ist.
Meesern
0

Dieses PHP-Skript wurde von der Notwendigkeit inspiriert, dasselbe wie bei der ursprünglichen Frage zu tun, bei der auf den fraglichen Servern eine andere Version von MariaDB ausgeführt wurde. Da es sich um PHP handelt, sollte es auf jeder Plattform funktionieren, die PHP unterstützt (Version 7.3 oder höher).

<?php
ini_set('display_errors','1');
ini_set('display_startup_errors','1');
error_reporting(E_ALL);

//
// You will want to modify the 4 variables below for your environment
//

$dbuser       = 'root';                   // DB user with authority to SHOW GRANTS from mysql.user
$dbpassword   = 'blahblah';               // password for the DB user
$useroutfile  = '/temp/Users.sql';        // where to write the user file that may be imported on new server
$grantoutfile = '/temp/Grants.sql';       // where to write the grant file that may be imported on new server
$ignore_users = ['root','replication_user'];  // array of users that should NOT be exported

//
// There really should not be any reason to modify anything below this comment 
// but please do browse through it and understand what is being done
//

$dsn = 'mysql:host=localhost;charset=utf8mb4';
$opt = [PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION ,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC       ,
        PDO::ATTR_EMULATE_PREPARES   => true                   ,
       ];
try {

    $ourdb = new PDO ($dsn,$dbuser,$dbpassword,$opt);

} catch (PDOException $e) {

    error_log($e);  // log the error so it may be looked at later if necessary
    echo 'Could not connect to the SQL server';
    exit;
}  // end of the try/catch block

$notuser = implode(',',array_map('add_quotes',$ignore_users));

//
// We got connected to the database so now let's make sure we can open the
// output files for writing - note that using mode w will overwrite any
// existing files so we'll always start off cleanly
//

$userout = fopen($useroutfile,'w');

if ($userout === false) {  // could not open the output file for writing for some reason

    error_log('Could not open the output file for writing (' . $useroutfile . ')');
    exit;

}  // end of if we could not open the output file for writing

$grantout = fopen($grantoutfile,'w');

if ($grantout === false) {  // could not open the output file for writing for some reason

    error_log('Could not open the output file for writing (' . $grantout . ')');
    exit;

}  // end of if we could not open the output file for writing

$Query = $ourdb->query("
    SELECT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS query 
           FROM mysql.user 
           WHERE user NOT IN(" . implode(',',array_map('add_quotes',$ignore_users)) . ")
");
$users = $Query->fetchAll(PDO::FETCH_COLUMN);

foreach ($users as $GrantQ) {  // go through each of the users found

    $UserQ  = $ourdb->query("$GrantQ");  // retrieve the grants for a user
    $grants = $UserQ->fetchAll(PDO::FETCH_COLUMN);

    foreach ($grants as $grant) {  // go through each of the grants found for this user

        if (stripos($grant,'IDENTIFIED BY PASSWORD') === false) {

            fwrite($grantout,$grant . ';' . PHP_EOL);  // write the command to actually do the grant

        } else {

            fwrite($userout,$grant . ';' . PHP_EOL);  // write the command to actually do the grant
}
        }  // end of foreach through the grants found

}  // end of foreach through the queries to show the grants for each user

fwrite($userout ,'FLUSH PRIVILEGES;' . PHP_EOL);  // make sure SQL knows about the new users and privileges
fwrite($grantout,'FLUSH PRIVILEGES;' . PHP_EOL);  // make sure SQL knows about the new users and privileges
fclose($userout);   // close our output file
fclose($grantout);  // close our output file
echo 'The grants for ' . count($users) . ' users were written to ' . $useroutfile . PHP_EOL;

function add_quotes($str) {return sprintf("'%s'", $str);}
Dave
quelle