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:
- 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.
- 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