Kullanıcıları Yedekle / Geri Yükle / Parolalar / Ayrıcalıklar


16

Bir sunucudan diğerine geçiyorum ve MySQL Sunucumdan tüm veritabanlarını + kullanıcıları / ayrıcalıkları / şifreleri yedeklemek istiyorum. Kullanarak bir veritabanını yedekledim mysqldump, ancak tüm kullanıcıları ve verilen ayrıcalıkları nasıl yedekleyeceğimi anlayamıyorum. Bunu başarmanın bir yolu var mı yoksa bunu yeni sunucuda yeni ayarlamam gerekiyor mu?


Verileri aynı MySQL sürümünü çalıştıran başka bir sunucuya mı taşıyorsunuz?
RolandoMySQLDBA

Yanıtlar:


16

'Mysql' veritabanı kullanıcılar / ayrıcalıklar / şifreler içerir. Yani diğer veritabanları ile birlikte mysql veritabanı dökümü almak

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

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

Bu mysql veritabanı tabloları hibe bilgisi içerir

kullanıcı: Kullanıcı hesapları, genel ayrıcalıklar ve diğer ayrıcalıksız sütunlar.

db: Veritabanı düzeyinde ayrıcalıklar.

tables_priv: Tablo düzeyinde ayrıcalıklar.

column_priv: Sütun düzeyinde ayrıcalıklar.

procs_priv: Saklı yordam ve işlev ayrıcalıkları.

İle çapraz kontrol geri yükledikten sonra

select Host, user, password from user ;

SHOW GRANTS FOR 'user'@'localhost';

7
Dikkat. Bunu MySQL'in daha yeni bir sürümüne yükleyecekseniz, mysql.userşema değişiklikleri nedeniyle dökümü başarısız olabilir.
Rick James

1
@RickJames: Daha yeni bir sürüme geçmek ve kullanıcıları geri yüklemek istiyorsak ne yapmalıyız?
brunoqc

1
mysql_upgradeşema değişiklikleriyle ilgilenen bir betiktir. Ancak, bir seferde yalnızca bir büyük değişiklik yapmanızı ve yerinde değil, yeniden yüklemenizi bekler. Araştır. (Üzgünüm, yükseltmeler konusunda deneyimim yok.)
Rick James

1
Geri yükleme işleminden sonra flush privileges;yeni MySQL'e de ihtiyacınız olabilir / gerekecektir . Like mysql -u root -p -e'flush privileges;' Bu yeni sunucunuzdaki root mysql şifrenizi eski sunucunuzdan root şifresi olarak ayarlayabilir / ayarlayacaktır, bu yüzden bunun ne olduğunu bildiğinizden emin olun.
meesern

0

Bu PHP betiği, söz konusu sunucuların MariaDB'nin farklı sürümünü çalıştırdığı orijinal soru ile aynı şeyi yapma ihtiyacından ilham aldı. PHP olduğu için PHP'yi destekleyen herhangi bir platformda (sürüm 7.3 veya üstü) çalışmalıdır.

<?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);}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.