Sauvegarder / restaurer les utilisateurs / mots de passe / privilèges


16

Je passe d'un serveur à un autre et je souhaite sauvegarder toutes les bases de données + utilisateurs / privilèges / mots de passe de mon serveur MySQL. J'ai trouvé pour sauvegarder une base de données en utilisant mysqldump, mais je ne peux pas comprendre comment sauvegarder tous les utilisateurs et les privilèges accordés. Existe-t-il un moyen d'y parvenir ou dois-je configurer ce nouveau sur le nouveau serveur?


Déplacez-vous les données vers un autre serveur exécutant la même version de MySQL?
RolandoMySQLDBA

Réponses:


16

La base de données 'mysql' contient des utilisateurs / privilèges / mots de passe. Prenez donc le vidage de la base de données mysql avec d'autres bases de données

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

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

Ces tables de base de données mysql contiennent des informations sur les subventions

utilisateur: comptes d'utilisateurs, privilèges globaux et autres colonnes sans privilèges.

db: privilèges au niveau de la base de données.

tables_priv: privilèges au niveau de la table.

colonnes_priv: privilèges au niveau de la colonne.

procs_priv: privilèges de procédure et de fonction stockés.

Après avoir restauré la vérification croisée avec

select Host, user, password from user ;

SHOW GRANTS FOR 'user'@'localhost';

7
Mise en garde. Si vous allez charger ceci dans une version plus récente de MySQL, le vidage de mysql.userpeut échouer en raison de modifications de schéma.
Rick James

1
@RickJames: que devons-nous faire si nous voulons migrer vers une version plus récente et restaurer les utilisateurs?
brunoqc

1
mysql_upgradeest un script pour prendre en charge les modifications de schéma. Mais il s'attend à ce que vous ne fassiez qu'un seul changement majeur à la fois, et en place, pas à recharger. Faites des recherches. (Désolé, je n'ai pas d'expérience dans le domaine des mises à niveau.)
Rick James

1
Après la restauration, vous pouvez / aurez également besoin flush privileges;du nouveau mysql. Comme mysql -u root -p -e'flush privileges;' ceci peut / va également définir votre mot de passe root mysql sur votre nouveau serveur pour être le mot de passe root de votre ancien serveur alors assurez-vous de savoir ce que c'est.
meesern

0

Ce script PHP a été inspiré par la nécessité de faire la même chose que la question d'origine où les serveurs en question exécutaient une version différente de MariaDB. Comme c'est PHP, il devrait fonctionner sur n'importe quelle plate-forme qui prend en charge PHP (version 7.3 ou supérieure).

<?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);}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.