¿Cómo puedo resolver los errores 1227 y de definidor al importar datos a mi instancia de base de datos de Amazon RDS para MySQL mediante mysqldump?

3 minutos de lectura
0

Cuando intento importar datos a una instancia de base de datos de Amazon Relational Database Service (Amazon RDS) para MySQL mediante mysqldump, aparece un error similar a uno de los siguientes:

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

Descripción corta

Se produce un error 1227 cuando la base de datos tiene el registro binario habilitado y el archivo mysqldump contiene un objeto almacenado, como un desencadenador, una vista, una función o un evento. Para obtener más información, consulte Binary Log.

Los errores de definidor se activan cuando MySQL intenta crear un objeto en un usuario de base de datos, pero ese usuario de base de datos no existe en la base de datos de destino. Es posible que reciba un error similar cuando MySQL intente crear un usuario para localhost, una acción que no está permitida en Amazon RDS. Esto se debe a que Amazon RDS no tiene permisos de superusuario.

Resolución

Resolver el error 1227

1.Defina el parámetro log_bin_trust_function_creators parameter en true en el grupo de parámetros de base de datos personalizado que cree para la instancia de base de datos.

2.Algunos comandos que suelen estar presentes en los archivos volcados de MySQL, como «SET @@SESSION.SQL_LOG_BIN= 0;», no están permitidos en RDS. Estas líneas deben eliminarse del archivo volcado o comentarse en el archivo volcado antes de ejecutarlo en la instancia de RDS.

Resolver error de definición

Los errores del definidor se pueden solucionar de varias maneras:

  • Eliminar la línea del definidor
  • Cambiar el nombre de los usuarios del definidor
  • Crear o volver a crear el archivo de volcado sin la opción de definidor

Eliminar la línea del definidor

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

La línea ahora muestra un resultado similar a este:

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

Cambiar el nombre de los usuarios del definidor

Cambie el nombre de root a masteruser y el de localhost a %host:

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

Nota: Puede utilizar% como comodín para todos los anfitriones.

Crear o volver a crear el archivo de volcado sin la opción de definidor

La utilidad de volcado de MySQL no ofrece la opción de eliminar un DEFINER. Algunos clientes de MySQL ofrecen la opción de ignorar el definidor al crear una copia de seguridad lógica, pero esta opción no aparece de forma predeterminada. Revise la documentación de su cliente MySQL preferido para ver si está disponible la opción de ignorar el definidor. El cliente de línea de comandos de MySQL no puede excluir el definidor. Sin embargo, el cliente se puede utilizar con herramientas de terceros para eliminar el definidor o para buscar y reemplazar el nombre de usuario y el host

Los siguientes ejemplos muestran cómo se puede eliminar el definidor en Linux, macOS o Subsistema Windows para Linux (WSL):

Eliminar:

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

Buscar y reemplazar:

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

Nota: Sustituya el valor de masteruser por el nombre de su usuario maestro de Amazon RDS.


Información relacionada

MySQL en Amazon RDS

Exportación de datos desde una instancia de base de datos MySQL mediante replicación