Backup / Ripristina utenti / Password / Privilegi


16

Sto passando da un server all'altro e voglio eseguire il backup di tutti i database + utenti / privilegi / password dal mio server MySQL. Ho trovato il backup di un database usando mysqldump, ma non riesco a capire, come fare il backup di tutti gli utenti e dei privilegi dati. C'è un modo per raggiungere questo obiettivo o devo impostarlo di nuovo sul nuovo server?


Stai spostando i dati su un altro server che esegue la stessa versione di MySQL?
RolandoMySQLDBA

Risposte:


16

Il database 'mysql' contiene utenti / privilegi / password. Quindi prendi il dump del database mysql insieme ad altri database

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

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

Queste tabelle del database mysql contengono informazioni sulla concessione

utente: account utente, privilegi globali e altre colonne senza privilegi.

db: privilegi a livello di database.

tables_priv: privilegi a livello di tabella.

colonne_priv: privilegi a livello di colonna.

procs_priv: procedura memorizzata e privilegi di funzione.

Dopo aver ripristinato il controllo incrociato con

select Host, user, password from user ;

SHOW GRANTS FOR 'user'@'localhost';

7
Attenzione. Se lo caricherai in una versione più recente di MySQL, il dump di mysql.userpotrebbe non riuscire a causa di modifiche allo schema.
Rick James,

1
@RickJames: cosa dobbiamo fare se vogliamo migrare a una versione più recente e ripristinare gli utenti?
brunoqc,

1
mysql_upgradeè uno script che si occupa delle modifiche allo schema. Ma si aspetta che tu stia facendo solo un grande cambiamento alla volta e sul posto, non ricaricando. Ricerca. (Mi dispiace, non ho esperienza nell'area degli aggiornamenti.)
Rick James,

1
Dopo il ripristino potrebbe essere necessario / sarà necessario anche flush privileges;sul nuovo mysql. Come mysql -u root -p -e'flush privileges;' Questo può / imposterà anche la tua password mysql di root sul tuo nuovo server in modo che sia la password di root del tuo vecchio server, quindi assicurati di sapere di cosa si tratta.
meesern

0

Questo script PHP è stato ispirato dalla necessità di fare la stessa cosa della domanda originale in cui i server in questione eseguivano versioni diverse di MariaDB. Poiché è PHP, dovrebbe funzionare su qualsiasi piattaforma che supporti PHP (versione 7.3 o successiva).

<?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);}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.