Erro do MySQL / Amazon RDS: “você não tem privilégios SUPER ...”

97

Estou tentando copiar meu banco de dados mysql de um Amazon EC2 para um RDS:

Eu fiz com sucesso um mysqldumpdo meu banco de dados em minha pasta raiz usando este:

root@ip-xx-xx-xx-xx:~# mysqldump my_database -u my_username -p > my_database.sql

Em seguida, tentei transferir este arquivo .sql para meu novo banco de dados RDS:

root@ip-xx-xx-xx-xx:~# mysql my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

Infelizmente, recebo a seguinte mensagem de erro:

You do not have the SUPER privilege and binary logging is enabled 
(you *might* want to use  the less safe log_bin_trust_function_creators variable)

Tentei de GRANT SUPER..várias maneiras, mas também recebo erros quando tento fazer isso. A digitação mysql > FLUSH privileges;também não funciona.

Eu sou um iniciante no mysql, sinto muito por uma pergunta tão fácil. Pensamentos?

Tim Peterson
fonte
9
Você não pode GRANT SUPERno RDS. O RDS não oferece nenhuma maneira de obter privilégios SUPER.
ceejayoz
Use o mesmo nome de usuário MySQL para criar o dump e restaurá-lo (para conexão e palavra-chave DEFINER no dump). Alterar log_bin_trust_function_creators não é a solução desejada. A pior coisa é usar o parâmetro -f neste caso
ad4s
no meu caso, meu sqlarquivo tem CREATE FUNCTIONdeclaração que precisa de um usuário privilegiado. veja isto
Contador م

Respostas:

63

Por http://getasysadmin.com/2011/06/amazon-rds-super-privileges/ , você precisa definir log_bin_trust_function_creatorscomo 1 no console AWS para carregar seu arquivo de despejo sem erros.

Se quiser ignorar esses erros e carregar o restante do arquivo de despejo, você pode usar a -fopção:

mysql -f my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

O -frelatará erros, mas continuará processando o restante do arquivo de despejo.

Ross Smith II
fonte
oi @Ross, obrigado por isso. Infelizmente, usar -fnão ajudou. Eu tenho o mesmo erro. Usando seu link, estou tendo problemas com a sintaxe das ferramentas RDS Cli. Ou seja, quando vou alterar os privilégios, recebo o seguinte erro:rds-modify-db-parameter-group: Malformed input-Unrecognized option: -–parameters=name=log_bin_trust_function_creators, Usage: rds-modify-db-parameter-group DBParameterGroupName --parameters "name=value, value=value, method=value" [ --parameters "name=value, value=value, method=value" ...] [General Options]
tim peterson
aqui está meu comando que me dá o erro acima: ./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx"Eu sei que deve ser um problema de citação ou traço duplo, mas nenhum desses tipos de alterações está funcionando até agora, ugh!
tim Peterson
4
A -fopção não fará com que os erros desapareçam, apenas permitirá que as instruções SQL não ofensivas no arquivo sejam processadas. Pelo que li, o RDS está engasgando com procedimentos armazenados no arquivo de despejo. Tente criar um arquivo de despejo sem procedimentos de armazenamento e veja se carrega bem:mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
Ross Smith II
2
- @ Ross, incrível que funcionou, meu banco de dados está lá, uau, isso é um problema irritante, sinto que a AWS deveria fazer algo a respeito.
tim Peterson
Pelo menos posso carregar todos os dados com a -fopção. A segunda fase pode ser despejar apenas rotinas / proc stred etc. separadamente
Kaymaz
134
  1. Abra o console da web RDS.
  2. Abra a guia “Grupos de parâmetros”.
  3. Crie um novo Grupo de Parâmetro. Na caixa de diálogo, selecione a família MySQL compatível com sua versão do banco de dados MySQL, dê um nome e confirme. Selecione o Grupo de Parâmetros recém-criado e emita “Editar Parâmetros”.
  4. Procure o parâmetro 'log_bin_trust_function_creators' e defina seu valor para '1 ′.
  5. Salve as alterações.
  6. Abra a guia “Instâncias”. Expanda sua instância do MySQL e emita a “Ação da instância” chamada “Modificar”.
  7. Selecione o grupo de parâmetros recém-criado e ative “Aplicar imediatamente”.
  8. Clique em “Continuar” e confirme as alterações.
  9. Aguarde até que a operação de "Modificação" seja concluída.
  10. Novamente, abra a guia “Instâncias”. Expanda sua instância do MySQL e expanda a guia “Ação da instância” e selecione "Reinicializar".
arun-r
fonte
> o que o ponto 9 faz ... você ajusta sua instância para usar o grupo de parâmetros definido anteriormente. Para obter mais detalhes, consulte esta postagem do blog original de Daniel Ferbers: techtavern.wordpress.com/2013/06/17/…
AndrewL
Isso interromperá a replicação do RDS Mysql?
Ramratan Gupta
oi @ arun-r, eu sigo os passos que você explicou, mas o parâmetro 'log_bin_trust_function_creators' não está disponível no caso. Acho que algo mudou no último AWS RDS. Você pode me ajudar como posso fazer isso agora? obrigado,
Pawan Developers
@RamratanGupta Não vai parar
arun-r
1
@ arun-r obrigado pela sua resposta. Eu resolvi meu problema. Na verdade, encontrei log_bin_trust_function_creators na lista. mas meu problema foi resolvido entrando em contato com o suporte da AWS
Pawan Developers
33

O problema com disparadores e procedimentos armazenados no arquivo de despejo é que essas definições incluem o usuário pelo qual o procedimento armazenado deve ser criado, o DEFINER. O usuário provavelmente não existe no RDS, então um erro é gerado. Para poder carregar o arquivo de despejo, você pode remover o DEFINER usando sed ou Perl e criar o procedimento armazenado / gatilho com o usuário que está realizando a importação.

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql

Agora você deve ser capaz de carregar o arquivo de despejo fixo

mysql my_database -u my_username -p -h rds_host < mysqldump.fixed.sql

Como disse na resposta anterior, você deve definir o parâmetro DB:

log_bin_trust_function_creators = 1
Anders
fonte
1
A limpeza dos definidores também pode ser realizada com sed: sed -i 's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g' ./TargetSqlFile.sql
siliconrockstar
14

Para mim, havia apenas 2 comandos em meu arquivo de despejo que exigiam privilégios SUPER:

  • SET @@GLOBAL.gtid_purged
  • SET @@SESSION.SQL_LOG_BIN

De acordo com os documentos do mysqldump, você pode desabilitá-los com --set-gtid-purged=OFF.

Então, olhando para man mysqldump :

Use ON se a intenção for implantar um novo escravo de replicação usando apenas alguns dos dados do servidor despejado. Use OFF se a intenção for reparar uma tabela copiando-a dentro de uma topologia. Use OFF se a intenção for copiar uma tabela entre topologias de replicação que são disjuntas e assim permanecerão.

Portanto, decidi adicionar --set-gtid-purged=OFFao meu mysqldumpcomando e poderia importar com êxito o arquivo de despejo resultante.

Sim_é_é
fonte
1
Sim, era isso. Meu arquivo de despejo era relativamente pequeno, então removi todas as ocorrências desses 2 comandos dele.
Zolbayar
6

Conforme definido na documentação da AWS, gatilhos, procedimentos e funções são desabilitados por padrão porque o registro binário está habilitado por padrão. A desativação basicamente torna seu banco de dados mais seguro, mas se você protegeu corretamente através da rede, isso não importa.

Siga estas etapas e seu problema será corrigido https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

Além disso, você não deve usar definidores ao criar procedimentos. Um simples comando sed pode removê-lo.

Josh Woodcock
fonte
1

Depois de usar a resposta do arun-r, se o problema não for resolvido, você precisa modificar o arquivo de despejo. É simples.

No arquivo de despejo, você encontrará linhas como:

DELIMITER ;;
CREATE DEFINER=`username_from_dumped_database`@`host_from_dumped_database` PROCEDURE `procedure_or_function_name`()
BEGIN

Você tem que substituir:

  • username_from_dumped_database pelo seu nome de usuário no banco de dados rds.
  • host_from_dumped_databse de %

Não sei por que, mas esse truque funcionou para mim. Um editor de texto simples é suficiente para fazer isso.

Damien Frances
fonte