Ir para o conteúdo

Como resolvo os erros 1227 e de definer quando uso o mysqldump para importar dados para minha instância de banco de dados Amazon RDS para MySQL?

3 minuto de leitura
0

Quando eu uso o mysqldump para importar dados para uma instância de banco de dados do Amazon Relational Database Service (Amazon RDS) para MySQL, recebo um erro 1227 ou de definer.

Resolução

Para revisar os eventos e as alterações do banco de dados, revise o log binário. Para obter mais informações, consulte The binary log (O log binário) no site do MySQL.

Erro 1227

Quando você ativa o log binário e o arquivo mysqldump contém um objeto armazenado, como um gatilho, visualização, função ou evento, você pode receber o seguinte erro:

“Error: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Access denied; you need (at least one of) the %s privilege(s) for this operation”.

Para resolver esse erro, realize as etapas a seguir:

  1. Defina o parâmetro log_bin_trust_function_creators como Verdadeiro no grupo de parâmetros de banco de dados personalizados que você criou para sua instância de banco de dados.
  2. Remova as linhas de comando, como SET @ @SESSION .SQL_LOG_BIN= 0; do arquivo de descarte antes de executar o arquivo na instância.

Erro de definer

Um erro de definer ocorre quando o MySQL tenta criar um objeto como usuário do banco de dados que não existe no banco de dados de destino. Ou então, um definer ocorre quando o MySQL tenta criar um usuário para o localhost porque o Amazon RDS não tem permissões de superusuário. Você pode ver um erro semelhante ao seguinte:
“Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW" error message.”

Para resolver esse erro, execute as seguintes ações:

Remova a linha DEFINER

Localize a linha DEFINER e, em seguida, exclua-a:

/*!50017 DEFINER=`root`@`localhost`*/

Exemplo de saída:

/*!50003 CREATE*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

Renomeie os usuários DEFINER

Renomeie a raiz para masteruser e localhost para %host:

/*!50017 DEFINER=`masteruser`@`%host`*/

Exemplo de saída:

/*!50003 CREATE*/ /*!50017 DEFINER=`masteruser`@`%`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

Observação: é possível usar % como um curinga para todos os hosts.

Remova a opção DEFINER e, em seguida, crie ou recrie o arquivo de descarte

A utilidade de descarte do MySQL não inclui uma opção para remover o DEFINER. Algumas utilidades do cliente MySQL oferecem a opção de ignorar o DEFINER ao criar backups lógicos, mas esse atributo não está disponível por padrão. Para determinar se você tem a opção de ignorar o DEFINER, consulte a documentação do seu cliente MySQL preferido. O cliente de linha de comando MySQL não pode excluir o DEFINER. No entanto, é possível usar o cliente com ferramentas de terceiros para remover o DEFINER ou localizar e substituir o nome de usuário e o host.

Para localizar e excluir a linha DEFINER no Linux, macOS ou Windows Subsystem for Linux (WSL), execute o seguinte comando:

sed -i -e 's/DEFINER=`root`@`localhost`//g' dump.sql

Para localizar e substituir o nome de usuário e o host no Linux, macOS ou WSL, execute o seguinte comando:

sed -i -e 's/DEFINER=`root`@`localhost`/DEFINER=`masteruser`@`%`/g' dump.sql

Observação: substitua masteruser pelo nome do seu usuário principal do Amazon RDS.

Informações relacionadas

Amazon RDS para MySQL

Exportar dados de uma instância de banco de dados MySQL usando replicação