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 mysqldump
não produzir nada que precise de privilégios SUPER?
Parece que muitas pessoas tiveram problemas semelhantes, como ter que correr sed
contra 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
fonte
log_bin_trust_function_creators
parâmetro para 1, mas ainda assim recebo o mesmo erro na linha 7844. #--masterdata=2
. A linha será comentada no despejo.Respostas:
Você provavelmente precisa
log_bin_trust_function_creators
= 1 no RDS, mas esse não é o problema, aqui.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
DEFINER
declaraçã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
SUPER
usuá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
DEFINER
declaraçã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.... 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.
fonte
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"
fonte