Primeira tentativa de migrar o EC2 MySQL para o Amazon RDS não está indo bem - privilégios SUPER

11

Eu tenho tentado mover um banco de dados existente do MySQL em execução no EC2 para uma nova instância do Amazon RDS (um experimento para ver se podemos avançar). Até agora, não está indo bem. Estou preso na importação inicial antes de configurar a replicação (instruções aqui ).

Eu preparei a instância do RDS conforme descrito e pode conectar-se a ela a partir da instância do EC2 usando o mysql. Eu executei o comando mysqldump como:

mysqldump --master-data --databases db1 db2 > dump.sql

Em seguida, tentou fazer o upload para o RDS com:

mysql -h RDSHost -P 3306 -u rdsuser --password=rdspassword < dump.sql

O primeiro problema estava na linha 22 do despejo:

ALTERAR MASTER PARA MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106;

Esta linha causou erro ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. Não tem problema, apenas comentei essa linha e espero corrigi-la mais tarde via mysql.rds_set_external_master (). Tentada a fazer upload, e tenho um erro muito semelhante: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. A seção em torno da linha 7844 fica assim:

/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`dev`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `jos_contributor_ids_view` AS select `jos_resource_contributors_view`.`uidNumber` AS `uidNumber` from `jos_resource_contributors_view` union select `jos_wiki_contributors_view`.`uidNumber` AS `uidNumber` from `jos_wiki_contributors_view` */;

Ao comentar as duas primeiras linhas e adicionar um 'CREATE' à terceira, consegui superar essa. Mas há toneladas de seções como esta. Existe alguma maneira de contornar isso sem toda a edição? Como uma opção para mysqldumpnão produzir nada que precise de privilégios SUPER?

Parece que muitas pessoas tiveram problemas semelhantes, como ter que correr sedcontra a saída do mysqldump / mysqlbinlog! Também vou postar no fórum da AWS - realmente acho que o RDS deve ter uma maneira mais tolerante de importar do mysqldump, ou uma ferramenta específica que pode ser executada em um banco de dados existente para criar um despejo que é uma reclamação com a segurança do RDS. Apenas me perguntei se alguém tinha outras receitas ou truques que possam ajudar aqui.

Obrigado,

Dave

dsl101
fonte
Desculpe - esqueci de dizer que tentei alterar o log_bin_trust_function_creatorsparâmetro para 1, mas ainda assim recebo o mesmo erro na linha 7844. #
dsl101
Postagem antiga, mas o primeiro erro que você pode evitar dizendo --masterdata=2. A linha será comentada no despejo.
Halfgaar

Respostas:

26

Você provavelmente precisa log_bin_trust_function_creators= 1 no RDS, mas esse não é o problema, aqui.

Você pode especificar um  DEFINER valor diferente de sua própria conta apenas se tiver o  SUPER privilégio.

- http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html

Quando um programa armazenado (proc, função, evento ou gatilho) está em execução, tudo o que faz tem as permissões do usuário que o definiu ou do usuário declarado explicitamente com uma DEFINERdeclaração. Isso permite, entre outras coisas, que programas armazenados permitam que outros usuários façam coisas com dados que eles não têm permissão direta para manipular, desde que tenham permissão para usar o próprio programa armazenado.

Seria uma vulnerabilidade séria, portanto, se um não SUPERusuário pudesse criar um procedimento com um definidor arbitrário, porque o usuário poderia escalar seus privilégios à vontade.

Isso também se aplica às visualizações, é claro, quando o contexto de segurança mais definido é usado, como no exemplo que você postou.

Uma das maiores reclamações que tenho com o RDS é que você não pode ter SUPER... e agora também pode ser uma sua :) porque esse fato é a causa do problema que você está tendo.

Obviamente, se eu estivesse executando um serviço gerenciado do MySQL, também não daria a ninguém SUPER, portanto o modelo de segurança deles faz sentido, mesmo que às vezes seja pesado.

Se todos os seus objetos tiverem o mesmo definidor, uma solução alternativa seria restaurar o dump usando essa conta em vez da conta que você está usando agora, mas isso parece improvável.

Excluir apenas a linha com a DEFINERdeclaração deve fazer com que o arquivo de despejo funcione nos casos em que ele aparece em uma linha por si só, ou você pode usar sed ou perl para modificar o arquivo ... uma ideia que eu já sei que você não gosta, mas é realmente bom no MySQL que essa invasão seja bastante legítima, e não muito longe dos tipos de coisas que tenho que fazer como DBA, mesmo em um ambiente que não seja RDS.

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

... possivelmente não é a resposta que você esperava, mas você pode executá-la no seu arquivo de despejo e deve acabar com um arquivo um pouco mais utilizável.

Michael - sqlbot
fonte
Muito obrigado pela resposta abrangente e por confirmar o que eu pensava sobre sed / perl ser a única solução. O aplicativo que estou usando é o Joomla altamente personalizado e, embora seja de código aberto, não tenho tempo / habilidade para analisá-lo para descobrir se ele passará bem ao RDS. Meu pensamento foi 'experimente e veja' - mas parece que o primeiro passo é o mais difícil - em grande parte devido às ferramentas de migração inadequadas (na minha opinião) da Amazon. Concordo com o modelo de segurança, mas se a saída padrão do mysqldump cria tantos problemas, por que eles não têm uma solução melhor? Vou pedir isso a eles também.
dsl101
1
IMPRESSIONANTE. muito obrigado por esse script perl. meu backup tinha mais de 4 GB e apenas abri-lo foi um desafio. isso salvou meu dia.
Emile Baizel
1
Ótima explicação, ótima resposta e ótima solução! Definidor estúpido.
rkaregaran
4
Muito obrigado pelo seu liner perl. É o único que pude encontrar que realmente funciona. Muitas outras pessoas simplesmente não. Eu votaria novamente se pudesse.
lucian303
1

No meu caso, foi a linha "CHANGE MASTER TO MASTER_LOG_FILE = ..." no dump que estava me dando o erro. Esta linha foi adicionada pela opção "--master-data" do mysqldump. No Amazon AWS, você precisa iniciar a replicação definindo os detalhes do mestre com o procedimento "mysql.rds_set_external_master", em vez disso, leia aqui

Então, apenas tomo notas dessa linha "head 22 backup.dump", onde a linha 22 relatou no erro. Em seguida, remova-o antes da importação, para o meu arquivo grande eu uso: "sed '22d' backup.dump> backup_clean.dump"

Igor Toma
fonte