사용자 / 암호 / 권한 백업 / 복원


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 데이터베이스 테이블에는 부여 정보가 포함되어 있습니다.

user : 사용자 계정, 글로벌 권한 및 기타 비 권한 열

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;' 새 서버의 루트 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.