Lorsque j'utilise mysqldump pour importer des données vers une instance de base de données Amazon Relational Database Service (Amazon RDS) for MySQL, j'obtiens une erreur 1227 ou definer.
Résolution
Pour examiner les événements et les modifications de votre base de données, consultez le journal binaire. Pour plus d’informations, consultez Le journal binaire sur le site Web de MySQL.
Erreur 1227
Lorsque vous activez la journalisation binaire et que le fichier mysqldump contient un objet stocké, tel qu'un déclencheur, une vue, une fonction ou un événement, l'erreur suivante peut s'afficher :
« Error: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Access denied; you need (at least one of) the %s privilege(s) for this operation. »
Pour résoudre cette erreur, procédez comme suit :
- Dans le groupe de paramètres de base de données personnalisé que vous avez créé pour votre instance de base de données, définissez le paramètre log_bin_trust_function_creators sur Vrai.
- Supprimez les lignes de commande telles que SET @ @SESSION .SQL_LOG_BIN= 0; du fichier de vidage avant de l'exécuter sur l'instance.
Erreur definer
Une erreur definer se produit lorsque MySQL essaie de créer un objet en tant qu'utilisateur de base de données qui n'existe pas dans la base de données cible. Ou bien, un definer apparaît lorsque MySQL essaie de créer un utilisateur pour l'hôte local parce qu'Amazon RDS ne dispose pas d'autorisations de superutilisateur. Un message d'erreur similaire au suivant peut s'afficher :
« Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW" error message. »
Pour résoudre cette erreur, procédez comme suit.
Supprimer la ligne DEFINER
Localisez la ligne DEFINER, puis supprimez-la :
/*!50017 DEFINER=`root`@`localhost`*/
Exemple de sortie :
/*!50003 CREATE*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW
Renommer les utilisateurs de DEFINER
Renommez la racine en masteruser et localhost en %host :
/*!50017 DEFINER=`masteruser`@`%host`*/
Exemple de sortie :
/*!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.
Supprimer l'option DEFINER, puis créer ou recréer le fichier de vidage
L'utilitaire de vidage MySQL n'inclut pas d'option permettant de supprimer DEFINER. Certains utilitaires client MySQL proposent une option permettant d'ignorer le DEFINER lorsque vous créez des sauvegardes logiques, mais cette fonctionnalité n'est pas disponible par défaut. Pour déterminer si vous avez la possibilité d'ignorer le DEFINER, consultez la documentation de votre client MySQL préféré. Le client de ligne de commande MySQL ne peut pas exclure le DEFINER. Cependant, vous pouvez utiliser le client avec des outils tiers pour supprimer le DEFINER ou rechercher et remplacer le nom d'utilisateur et l'hôte.
Pour rechercher et supprimer la ligne DEFINER dans le sous-système Linux, macOS ou Windows pour Linux (WSL), exécutez la commande suivante :
sed -i -e 's/DEFINER=`root`@`localhost`//g' dump.sql
Pour rechercher et remplacer le nom d'utilisateur et l'hôte sous Linux, macOS ou WSL, exécutez la commande suivante :
sed -i -e 's/DEFINER=`root`@`localhost`/DEFINER=`masteruser`@`%`/g' dump.sql
Remarque : Remplacez masteruser par le nom de votre utilisateur principal Amazon RDS.
Informations connexes
Amazon RDS for MySQL
Exportation de données depuis une instance de base de données MySQL à l'aide de la réplication