Como resolver erros 1227 e do definidor ao importar dados para minha instância de banco de dados do Amazon RDS para MySQL usando o mysqldump?

3 minuto de leitura
0

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