Cadangkan / Kembalikan Pengguna / Kata Sandi / Hak Istimewa

16

Saya pindah dari satu server ke server lain dan saya ingin membuat cadangan semua basis data + pengguna / hak istimewa / kata sandi dari Server MySQL saya. Saya menemukan mem-backup database menggunakan mysqldump, tapi saya tidak tahu, bagaimana membuat backup semua pengguna dan hak istimewa yang diberikan. Apakah ada cara untuk mencapai ini atau apakah saya harus mengatur ini di server baru?

Nidhoegger
sumber
Apakah Anda memindahkan data ke server lain yang menjalankan versi MySQL yang sama?
RolandoMySQLDBA

Jawaban:

16

Basis data 'mysql' berisi pengguna / hak istimewa / kata sandi. Jadi ambil dump mysql database bersama dengan database lain

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

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

Tabel database mysql ini berisi informasi hibah

pengguna: Akun pengguna, hak istimewa global, dan kolom non-hak istimewa lainnya.

db: Hak istimewa tingkat basis data.

tables_priv: Hak istimewa tingkat-tabel.

column_priv: Hak istimewa tingkat kolom.

procs_priv: Prosedur tersimpan dan hak istimewa fungsi.

Setelah mengembalikan cek silang dengan

select Host, user, password from user ;

SHOW GRANTS FOR 'user'@'localhost';
Koustuv Chatterjee
sumber
7
Peringatan. Jika Anda akan memuat ini ke versi MySQL yang lebih baru, dump mysql.usermungkin gagal karena perubahan skema.
Rick James
1
@RickJames: apa yang harus kita lakukan jika kita ingin bermigrasi ke versi yang lebih baru dan memulihkan pengguna?
brunoqc
1
mysql_upgradeadalah skrip untuk menangani perubahan skema. Tapi itu mengharapkan Anda untuk membuat hanya satu perubahan besar pada satu waktu, dan di tempat, tidak memuat ulang. Penelitian itu. (Maaf, saya tidak punya pengalaman di bidang peningkatan.)
Rick James
1
Setelah mengembalikan Anda mungkin / juga akan membutuhkan flush privileges;mysql baru. Seperti mysql -u root -p -e'flush privileges;' ini dapat / juga akan mengatur kata sandi root mysql Anda di server baru Anda menjadi kata sandi root dari server lama Anda jadi pastikan Anda tahu apa itu.
meesern
0

Script PHP ini terinspirasi oleh kebutuhan untuk melakukan hal yang sama seperti pertanyaan asli di mana server yang bersangkutan menjalankan versi MariaDB yang berbeda. Karena itu PHP, ia harus bekerja pada platform apa pun yang mendukung PHP (versi 7.3 atau lebih tinggi).

<?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
sumber