AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 100511
Accepted
Nidhoegger
Nidhoegger
Asked: 2015-05-05 03:28:46 +0800 CST2015-05-05 03:28:46 +0800 CST 2015-05-05 03:28:46 +0800 CST

Fazer backup/restaurar usuários/senhas/privilégios

  • 772

Estou mudando de um servidor para outro e quero fazer backup de todos os bancos de dados + usuários/privilégios/senhas do meu servidor MySQL. Eu encontrei para fazer backup de um banco de dados usando mysqldump, mas não consigo descobrir como fazer backup de todos os usuários e os privilégios fornecidos. Existe uma maneira de conseguir isso ou eu tenho que configurar isso recentemente no novo servidor?

mysql migration
  • 2 2 respostas
  • 79546 Views

2 respostas

  • Voted
  1. Best Answer
    koustuv
    2015-05-05T04:42:08+08:002015-05-05T04:42:08+08:00

    O banco de dados 'mysql' contém usuários/privilégios/senhas. Então tire o despejo do banco de dados mysql junto com outros bancos de dados

    mysqldump [options] --all-databases > all_databases_dump.sql
    
    mysqldump -u root -p mysql user > user_table_dump.sql
    

    Essas tabelas de banco de dados mysql contêm informações de concessão

    user: contas de usuário, privilégios globais e outras colunas sem privilégios.

    db: Privilégios em nível de banco de dados.

    tables_priv: Privilégios em nível de tabela.

    columns_priv: Privilégios em nível de coluna.

    procs_priv: Privilégios de procedimento e função armazenados.

    Depois de restaurar a verificação cruzada com

    select Host, user, password from user ;
    
    SHOW GRANTS FOR 'user'@'localhost';
    
    • 22
  2. Dave
    2019-12-18T11:27:32+08:002019-12-18T11:27:32+08:00

    Este script PHP foi inspirado pela necessidade de fazer a mesma coisa que a pergunta original onde os servidores em questão estavam rodando versões diferentes do MariaDB. Como é PHP, deve funcionar em qualquer plataforma que suporte PHP (versão 7.3 ou superior).

    <?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);}
    
    • 0

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve