Comment puis-je résoudre les erreurs 1227 et de definer lors de l'importation des données vers mon instance de base de données Amazon RDS for MySQL à l'aide de mysqldump ?

Dernière mise à jour : 29-04-2022

Lorsque j'essaie d'importer des données vers une instance de base de données Amazon Relational Database Service (Amazon RDS) for MySQL à l'aide de mysqldump, je reçois un message d'erreur similaire à l’un des suivants :

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

Brève description

Une erreur 1227 se produit lorsque le journal binaire de la base de données est activé et que le fichier mysqldump contient un objet stocké, comme un déclencheur, une vue, une fonction ou un événement. Pour plus d'informations, consultez le Journal binaire.

Les erreurs de definer sont déclenchées lorsque MySQL tente de créer un objet dans le cadre d'un utilisateur de base de données, mais que l'utilisateur de base de données n'existe pas dans la base de données de destination. Vous pouvez recevoir une erreur similaire lorsque MySQL tente de créer un utilisateur pour localhost, une action qui n'est pas autorisée pour Amazon RDS. Cela est dû au fait qu'Amazon RDS ne dispose pas d'autorisation de super-utilisateur.

Résolution

Résoudre l'erreur 1227

1.    Définissez le paramètre log_bin_trust_function_creators sur true (vrai) dans le groupe de paramètres de base de données personnalisées que vous créez pour votre instance de base de données.

2.    Certaines commandes généralement présentes dans les fichiers de vidage MySQL, telles que «SET @@SESSION.SQL_LOG_BIN= 0; », ne sont pas autorisées dans RDS. Ces lignes doivent être supprimées du fichier de vidage ou commentées de celui-ci avant que le fichier ne soit exécuté sur l'instance RDS.

Résoudre l'erreur de definer

Les erreurs de definer peuvent être traitées de plusieurs manières :

  • Supprimer la ligne de definer
  • Renommer les utilisateurs de definer
  • Créer ou recréer le fichier de vidage sans l'option definer

Supprimer la ligne de definer

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

La ligne affiche désormais une sortie similaire à celle-ci :

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

Renommer les utilisateurs de definer

Renommez la root (racine) enmasteruser et localhost en%host :

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

Remarque : vous pouvez utiliser % comme caractère générique pour tous les hôtes.

Créez ou recréez le fichier de vidage sans l'option definer.

L'utilitaire de vidage MySQL n'offre pas la possibilité de supprimer un DEFINER. Certains clients MySQL fournissent la possibilité d'ignorer le definer lors de la création d'une sauvegarde logique, mais cette option n'est pas présente par défaut. Consultez la documentation de votre client MySQL préféré pour voir si l'option pour ignorer le DEFINER est disponible. Le client de ligne de commande MySQL n'est pas en mesure d'exclure le definer. Toutefois, le client peut être utilisé avec des outils tiers pour supprimer le DEFINER ou pour rechercher et remplacer le nom d'utilisateur et de l'hôte

Consultez les exemples suivants pour voir comment le DEFINER peut être supprimé dans Linux, macOS et Windows Subsystem for Linux (WSL) :

Supprimer :

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

Rechercher et remplacer :

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

Remarque : remplacez la valeur de masteruser par le nom de votre utilisateur principal Amazon RDS.


Cet article vous a-t-il été utile ?


Avez-vous besoin d'aide pour une question technique ou de facturation ?