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 / server / Perguntas / 8860
Accepted
Gareth
Gareth
Asked: 2009-05-16 22:08:46 +0800 CST2009-05-16 22:08:46 +0800 CST 2009-05-16 22:08:46 +0800 CST

Como posso exportar os privilégios do MySQL e depois importar para um novo servidor?

  • 772

Eu sei como exportar/importar os bancos de dados usando mysqldump e tudo bem, mas como faço para obter os privilégios no novo servidor.

Para pontos extras, já existem alguns bancos de dados existentes no novo, como importo os privilégios de servidores antigos sem destruir o par existente.

Servidor antigo: 5.0.67-community

Novo servidor: 5.0.51a-24+lenny1

EDIT: Eu tenho um dump do banco de dados 'mysql' do servidor antigo e agora quero saber a maneira correta de mesclar com o banco de dados 'mysql' no novo servidor.

Eu tentei um 'Import' direto usando o phpMyAdmin e acabei com um erro em relação a uma duplicata (uma que eu já migrei manualmente).

Alguém tem uma maneira elegante de mesclar os dois bancos de dados 'mysql'?

linux mysql debian mysql-replication database-administration
  • 11 11 respostas
  • 146160 Views

11 respostas

  • Voted
  1. Best Answer
    Bruno Bronosky
    2009-05-28T07:51:35+08:002009-05-28T07:51:35+08:00

    Não mexa com o banco de dados mysql. Há muito mais acontecendo lá do que apenas a tabela de usuários. Sua melhor aposta é o comando " SHOW GRANTS FOR". Eu tenho muitos aliases e funções de manutenção da CLI no meu .bashrc (na verdade, meus .bash_aliases que eu origino no meu .bashrc). Esta função:

    mygrants()
    {
      mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
        'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';'
        ) AS query FROM mysql.user" | \
      mysql $@ | \
      sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
    }
    

    O primeiro comando mysql usa SQL para gerar SQL válido que é canalizado para o segundo comando mysql. A saída é então canalizada através do sed para adicionar comentários bonitos.

    O $@ no comando permitirá que você o chame como: mygrants --host=prod-db1 --user=admin --password=secret

    Você pode usar seu kit de ferramentas unix completo assim:

    mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret
    

    Essa é a maneira certa de mover usuários. Sua ACL do MySQL é modificada com SQL puro.

    • 177
  2. RolandoMySQLDBA
    2012-06-19T10:24:02+08:002012-06-19T10:24:02+08:00

    Existem dois métodos para extrair SQL Grants de uma instância MySQL

    MÉTODO 1

    Você pode usar pt-show-grants do Percona Toolkit

    MYSQL_CONN="-uroot -ppassword"
    pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql
    

    MÉTODO #2

    Você pode emular pt-show-grantscom o seguinte

    MYSQL_CONN="-uroot -ppassword"
    mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql
    

    Qualquer um dos métodos produzirá um dump SQL puro das concessões do MySQL. Tudo o que resta a fazer é executar o script em um novo servidor:

    mysql -uroot -p -A < MySQLUserGrants.sql
    

    De uma chance !!!

    • 58
  3. rmldj
    2011-09-03T12:27:55+08:002011-09-03T12:27:55+08:00

    A resposta de Richard Bronosky foi extremamente útil para mim. Muito Obrigado!!!

    Aqui está uma pequena variação que foi útil para mim. É útil para transferir usuários, por exemplo, entre duas instalações do Ubuntu executando o phpmyadmin. Apenas despeje privilégios para todos os usuários, exceto root, phpmyadmin e debian-sys-maint. O código é então

    mygrants()
    {
    mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
    'SHOW GRANTS FOR ''', user, '''@''', host, ''';'
    ) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')"  | \
    mysql $@ | \
    sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
    }
    
    • 15
  4. MrkiMile
    2012-05-02T04:08:10+08:002012-05-02T04:08:10+08:00

    Ou utilize o percona-toolkit (antigo maatkit) e use pt-show-grants(ou mk-show-grants) para esse fim. Não há necessidade de scripts complicados e/ou procedimentos armazenados.

    • 7
  5. nedm
    2009-05-16T22:24:48+08:002009-05-16T22:24:48+08:00

    Você pode fazer o mysqldump do banco de dados 'mysql' e importar para o novo; um flush_privileges ou reiniciar será necessário e você definitivamente desejará fazer backup do banco de dados mysq existente primeiro.

    Para evitar remover seus privilégios existentes, certifique-se de anexar em vez de substituir as linhas nas tabelas de privilégios (db, columns_priv, host, func, etc.).

    • 6
  6. Lenny
    2011-05-10T14:05:39+08:002011-05-10T14:05:39+08:00

    Você também pode fazer isso como um procedimento armazenado:

    CREATE PROCEDURE spShowGrants()
        READS SQL DATA
        COMMENT 'Show GRANT statements for users'
    BEGIN
        DECLARE v VARCHAR(64) CHARACTER SET utf8;
        DECLARE c CURSOR FOR
        SELECT DISTINCT CONCAT(
            'SHOW GRANTS FOR ', user, '@', host, ';'
        ) AS query FROM mysql.user;
        DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;  
        OPEN c;
        WHILE TRUE DO
            FETCH c INTO v;
            SET @v = v;
            PREPARE stmt FROM @v;
            EXECUTE stmt;
        END WHILE;
        CLOSE c;
    END
    

    e chame-o com

    $ mysql -p -e "CALL spShowGrants" mysql
    

    em seguida, canalize a saída por meio do comando sed de Richards para obter um backup dos privilégios.

    • 5
  7. Ibrahim Lawal
    2012-05-04T10:11:10+08:002012-05-04T10:11:10+08:00

    Que tal um script PHP? :)

    Veja a fonte neste script e você terá todos os privilégios listados:

    //connect
    mysql_select_db("mysql", mysql_connect("localhost","root",""));
    
    //create grants select statements
    $rs = mysql_query("SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS query FROM user");
    
    //iterate through grants
    while ($row=mysql_fetch_array($rs)) {
        //run grant query
        $rs2 = mysql_query($row['query']);
        //iterate through results
        while($row2 = mysql_fetch_array($rs2)){
            //print results
            echo $row2[0] . ";\n\n";
        }
    }
    
    • 5
  8. Tom
    2011-09-03T17:16:22+08:002011-09-03T17:16:22+08:00

    Embora pareça que a resposta de @Richard Bronosky seja a correta, me deparei com essa pergunta depois de tentar migrar um conjunto de bancos de dados de um servidor para outro e a solução foi muito mais simples:

    server1$ mysqldump -u root -p --all-databases > dbdump.sql
    
    server2$ mysql -u root -p < dbdump.sql
    

    Nesse ponto, todos os meus dados estavam visíveis se eu entrasse como root, a mysql.usertabela tinha tudo o que eu esperava, mas não consegui fazer login como nenhum dos outros usuários e encontrei essa pergunta assumindo que eu teria que re- emitir as GRANTdeclarações.

    No entanto, acontece que o servidor mysql simplesmente precisava ser reiniciado para que os privilégios atualizados nas mysql.*tabelas entrassem em vigor:

    server2$ sudo restart mysql
    

    Espero que isso ajude alguém a alcançar o que deveria ser uma tarefa simples!

    • 3
  9. Rony
    2010-09-07T15:03:57+08:002010-09-07T15:03:57+08:00

    crie um arquivo de script de shell com o seguinte código:

    #############################################3
    echo "SELECT DISTINCT CONCAT (\"show grants for '\", user, \"'@'\", host, \"';\") AS query FROM mysql.user; " >   script.sql    
    echo "*** You will be asked to enter the root password twice ******"    
    mysql -u root -p  < script.sql > output.sql ;    
    cat output.sql | grep show > output1.sql  ; rm output.sql -f ; 
    mysql -u root -p  < output1.sql > output.sql ;
    clear
    echo "-----Exported Grants-----"    
    cat  output.sql ; rm  output.sql   output1.sql -f    
    echo "-------------------------"
    rm  script.sql -f
    
    #

    **** então execute-o no shell assim: você será solicitado a digitar a senha do root duas vezes e então o GRANTS SQL será exibido na tela.****

    • 2
  10. sjas
    2016-04-14T10:33:21+08:002016-04-14T10:33:21+08:00

    One-liner fazendo praticamente o mesmo que o awesome pt-show-grants:

    mysql --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql --skip-column-names -A | sed 's/$/;/g'
    

    Baseado apenas em ferramentas unix, nenhum software adicional é necessário.

    Execute de dentro de um shell bash, presumindo que você tenha um trabalho .my.cnfem que a senha do seu mysql rootusuário possa ser lida.

    • 0

relate perguntas

  • Protegendo um novo servidor Ubuntu [fechado]

  • (Soft) RAID 6 no Ubuntu 7.10, devo migrar para 8.10?

Sidebar

Stats

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

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Resolver o nome do host do endereço IP

    • 8 respostas
  • Marko Smith

    Como posso classificar a saída du -h por tamanho

    • 30 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    Qual é o utilitário de linha de comando no Windows para fazer uma pesquisa reversa de DNS?

    • 14 respostas
  • Marko Smith

    Como verificar se uma porta está bloqueada em uma máquina Windows?

    • 4 respostas
  • Marko Smith

    Qual porta devo abrir para permitir a área de trabalho remota?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    MikeN No Nginx, como posso reescrever todas as solicitações http para https mantendo o subdomínio? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 Qual é a diferença entre colchetes duplos e simples no bash? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch Como altero a senha da minha chave privada? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt Como funciona a sub-rede IPv4? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

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