Quando tento importar dados para uma instância de banco de dados do Amazon Relational Database Service (Amazon RDS) para MySQL usando mysqldump, recebo um erro semelhante a um destes:
Error: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Access denied; you need (at least one of) the %s privilege(s) for this operation.
Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW
Breve descrição
Um erro 1227 ocorre quando o banco de dados tem o log binário ativado e o arquivo mysqldump contém um objeto armazenado, como um acionador, visualização, função ou evento. Para mais informações, consulte Log binário.
Os erros do definidor são acionados quando o MySQL tenta criar um objeto em um usuário do banco de dados, mas esse usuário do banco de dados não existe no banco de dados de destino. Você pode receber um erro semelhante quando o MySQL tenta criar um usuário para localhost, uma ação que não é permitida para o Amazon RDS. Isso ocorre porque o Amazon RDS não tem permissões de superusuário.
Resolução
Resolução do erro 1227
1. Defina o parâmetro log_bin_trust_function_creators como true no grupo de parâmetros de banco de dados personalizados que você cria para sua instância de banco de dados.
2. Alguns comandos geralmente presentes nos arquivos de despejo do MySQL, como “**SET @@SESSION.SQL_LOG_BIN= 0; **”, não são permitidos no RDS. Essas linhas devem ser excluídas ou comentadas no arquivo de despejo antes que o arquivo seja executado na instância do RDS.
Resolver erro do definidor
Os erros do definidor podem ser resolvidos de várias maneiras:
- Remova a linha definidora
- Renomeie os usuários definidores
- Crie ou recrie o arquivo de despejo sem a opção definidor
Remova a linha definidora
/*!50017 DEFINER=`root`@`localhost`*/
A linha agora mostra uma saída semelhante a esta:
/*!50003 CREATE*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW
Renomeie os usuários definidores
Renomeie a raiz para masteruser e localhost para %host:
/*!50003 CREATE*/ /*!50017 DEFINER=`masteruser`@`%`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW
**Observação:**Você pode usar % como um curinga para todos os hosts.
Crie ou recrie o arquivo de despejo sem a opção definidor.
O utilitário de despejo do MySQL não oferece a opção de remover um DEFINIDOR. Alguns clientes MySQL oferecem a opção de ignorar o definidor ao criar um backup lógico, mas essa opção não ocorre por padrão. Analise a documentação do seu cliente MySQL de preferência para ver se a opção de ignorar o DEFINIDOR está disponível. O cliente de linha de comando do MySQL não consegue excluir o definidor. No entanto, o cliente pode ser usado com ferramentas de terceiros para remover o DEFINIDOR ou para localizar e substituir o nome de usuário e o host
Os exemplos a seguir demonstram como o DEFINIDOR pode ser removido no Linux, macOS ou Windows Subsystem for Linux (WSL):
Remova:
sed -i -e 's/DEFINER=`root`@`localhost`//g' dump.sql
Localize e substitua:
sed -i -e 's/DEFINER=`root`@`localhost`/DEFINER=`masteruser`@`%`/g' dump.sql
Observação: Substitua o valor de masteruser pelo nome do seu usuário mestre do Amazon RDS.
Informações relacionadas
MySQL no Amazon RDS
Exportação de dados de uma instância de banco de dados do MySQL usando replicação