สำรอง / กู้คืนผู้ใช้ / รหัสผ่าน / สิทธิ์


16

ฉันย้ายจากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่งและฉันต้องการสำรองฐานข้อมูลทั้งหมด + ผู้ใช้ / สิทธิ์ / รหัสผ่านจากเซิร์ฟเวอร์ MySQL ของฉัน ฉันพบว่าการสำรองฐานข้อมูลโดยใช้mysqldumpแต่ฉันไม่สามารถหาวิธีการสำรองข้อมูลผู้ใช้ทั้งหมดและสิทธิ์ที่กำหนด มีวิธีในการบรรลุผลนี้หรือฉันต้องตั้งค่านี้ใหม่บนเซิร์ฟเวอร์ใหม่หรือไม่?


คุณย้ายข้อมูลไปยังเซิร์ฟเวอร์อื่นที่ใช้ MySQL เวอร์ชั่นเดียวกันหรือไม่?
RolandoMySQLDBA

คำตอบ:


16

ฐานข้อมูล 'mysql' มีผู้ใช้ / สิทธิ์ / รหัสผ่าน ดังนั้นการถ่ายโอนข้อมูลของฐานข้อมูล mysql พร้อมกับฐานข้อมูลอื่น ๆ

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

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

ตารางฐานข้อมูล mysql เหล่านี้มีข้อมูลการให้สิทธิ์

ผู้ใช้:บัญชีผู้ใช้สิทธิ์ระดับโลกและคอลัมน์อื่น ๆ ที่ไม่ใช่สิทธิ์

db:สิทธิ์ระดับฐานข้อมูล

tables_priv:สิทธิ์ระดับตาราง

columns_priv:สิทธิ์ระดับคอลัมน์

procs_priv:ขั้นตอนการจัดเก็บและสิทธิ์ของฟังก์ชัน

หลังจากเรียกคืนการตรวจสอบไขว้กับ

select Host, user, password from user ;

SHOW GRANTS FOR 'user'@'localhost';

7
ความระมัดระวัง หากคุณกำลังโหลดสิ่งนี้ลงใน MySQL เวอร์ชันใหม่การถ่ายโอนข้อมูลmysql.userอาจล้มเหลวเนื่องจากการเปลี่ยนแปลงสคีมา
Rick James

1
@RickJames: เราควรทำอย่างไรหากเราต้องการย้ายไปเป็นเวอร์ชั่นที่ใหม่กว่าและกู้คืนผู้ใช้
brunoqc

1
mysql_upgradeเป็นสคริปต์ที่จะดูแลการเปลี่ยนแปลงสคีมา แต่คาดว่าคุณจะทำการเปลี่ยนแปลงครั้งใหญ่เพียงครั้งเดียวและในสถานที่ไม่ใช่การโหลดซ้ำ วิจัยมัน (ขออภัยฉันไม่มีประสบการณ์ในการอัปเกรด)
Rick James

1
หลังจากคืนค่าคุณอาจ / จะต้องflush privileges;ใช้ mysql ใหม่ด้วย เช่นmysql -u root -p -e'flush privileges;' นี้อาจ / จะตั้งค่ารหัสผ่าน root ของคุณ mysql บนเซิร์ฟเวอร์ใหม่ของคุณให้เป็นรหัสผ่านหลักจากเซิร์ฟเวอร์เก่าของคุณดังนั้นให้แน่ใจว่าคุณรู้ว่ามันคืออะไร
meesern

0

สคริปต์ PHP นี้ได้รับแรงบันดาลใจจากความต้องการที่จะทำสิ่งเดียวกันกับคำถามเดิมที่เซิร์ฟเวอร์ที่มีปัญหากำลังใช้งาน MariaDB รุ่นต่างๆ เนื่องจากเป็น PHP จึงควรใช้งานได้กับทุกแพลตฟอร์มที่รองรับ PHP (เวอร์ชั่น 7.3 หรือสูงกว่า)

<?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);}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.