it-swarm-pt.tech

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

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

Para obter pontos extras, já existem alguns bancos de dados existentes no novo, como importo os privilégios de servidores antigos sem diminuir o número de pares existentes.

Servidor antigo: 5.0.67-community

Novo servidor: 5.0.51a-24 + lenny1

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

Tentei um 'Import' direto usando o phpMyAdmin e acabei com um erro relacionado a uma duplicata (que já migrei manualmente).

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

90
Gareth

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 forneço no meu .bashrc). Esta função:

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

O primeiro comando do mysql usa SQL para gerar SQL válido, que é canalizado para o segundo comando do 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 da seguinte maneira:

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 MySQL ACL é modificada com SQL puro.

171
Bruno Bronosky

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

MÉTODO 1

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

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

MÉTODO # 2

Você pode emular pt-show-grants com 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 despejo 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 !!!

48
RolandoMySQLDBA

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 [email protected] -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', Host, ''';'
) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')"  | \
mysql [email protected] | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
15
rmldj

Ou utilize o percona-toolkit (antigo maatkit) e use pt-show-grants (ou mk-show-grants) para aquele propósito. Não há necessidade de scripts pesados ​​e/ou procedimentos armazenados.

7
MrkiMile

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

Para evitar remover os privilégios existentes, anexe em vez de substituir linhas nas tabelas de privilégios (db, column_priv, Host, func, etc.).

5
nedm

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";
    }
}
4
Ibrahim Lawal

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 com

$ mysql -p -e "CALL spShowGrants" mysql

depois canalize a saída através do comando Richards sed para obter um backup dos privilégios.

4
Lenny

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 era 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 fiz login como root, o mysql.user table continha tudo o que eu esperava, mas não consegui efetuar login como nenhum dos outros usuários e encontrei essa pergunta assumindo que precisaria reemitir as instruções GRANT.

No entanto, verifica-se que o servidor mysql simplesmente precisava ser reiniciado para os privilégios atualizados no diretório mysql.* tabelas para entrar em vigor:

server2$ Sudo restart mysql

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

3
Tom

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

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

****, em seguida, execute-o no Shell da seguinte maneira: você será solicitado a digitar a senha root duas vezes e, em seguida, o GRANTS SQL será exibido na tela. ****

2
Rony

Uma linha fazendo praticamente o mesmo que o incrível 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, supondo que você tenha um .my.cnf Ativo onde a senha do seu usuário mysql root Possa ser lida.

0
sjas