Comment puis-je résoudre les erreurs 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/05/2020

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 à ce qui suit :

Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

Brève description

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 et 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, ce qui n'est pas autorisé pour Amazon RDS. Cela est dû au fait qu'Amazon RDS ne dispose pas des privilèges de super-utilisateur.

Solution

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

1.    Supprimer la ligne de définition suivante :

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

La ligne doit se lire comme suit :

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

2.    Renommez les utilisateurs definer root d'une part, et renommez localhost par masteruser et %host, respectivement :

/*!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.

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