Erreur MySQL / Amazon RDS: "vous ne disposez pas des privilèges SUPER…"

97

J'essaie de copier ma base de données mysql d'un Amazon EC2 vers un RDS:

J'ai réussi à faire une mysqldumpde ma base de données dans mon dossier racine en utilisant ceci:

root@ip-xx-xx-xx-xx:~# mysqldump my_database -u my_username -p > my_database.sql

Ensuite, j'ai essayé de transférer ce fichier .sql vers ma nouvelle base de données RDS:

root@ip-xx-xx-xx-xx:~# mysql my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

Malheureusement, je reçois le message d'erreur suivant:

You do not have the SUPER privilege and binary logging is enabled 
(you *might* want to use  the less safe log_bin_trust_function_creators variable)

J'ai essayé de GRANT SUPER..différentes manières, mais j'obtiens des erreurs lorsque j'essaie de le faire aussi. La frappe mysql > FLUSH privileges;ne fonctionne pas non plus.

Je suis un débutant mysql, désolé pour une question aussi simple. Pensées?

Tim Peterson
la source
9
Vous ne pouvez pas GRANT SUPERsur RDS. RDS n'offre aucun moyen d'obtenir des privilèges SUPER.
ceejayoz
Utilisez le même nom d'utilisateur MySQL pour créer un vidage et le restaurer (pour la connexion et le mot clé DEFINER dans le vidage). La modification de log_bin_trust_function_creators n'est pas la solution souhaitée. Le pire est d'utiliser le paramètre -f dans ce cas
ad4s
dans mon cas, mon sqlfichier a une CREATE FUNCTIONdéclaration qui nécessite un utilisateur privilégié. voir ça
Accountant م

Réponses:

63

Par http://getasysadmin.com/2011/06/amazon-rds-super-privileges/ , vous devez définir log_bin_trust_function_creatorssur 1 dans la console AWS , pour charger votre fichier de vidage sans erreur.

Si vous souhaitez ignorer ces erreurs et charger le reste du fichier de vidage, vous pouvez utiliser l' -foption:

mysql -f my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

Le -frapportera des erreurs, mais continuera de traiter le reste du fichier de vidage.

Ross Smith II
la source
salut @ Ross, merci pour cela. Malheureusement, l'utilisation -fn'a pas aidé. J'ai eu la même erreur. En utilisant votre lien, j'ai des problèmes avec la syntaxe des outils RDS Cli. Cela signifie que lorsque je vais modifier les privilèges, j'obtiens l'erreur suivante:rds-modify-db-parameter-group: Malformed input-Unrecognized option: -–parameters=name=log_bin_trust_function_creators, Usage: rds-modify-db-parameter-group DBParameterGroupName --parameters "name=value, value=value, method=value" [ --parameters "name=value, value=value, method=value" ...] [General Options]
tim peterson
voici ma commande qui me donne l'erreur ci-dessus: ./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx"je sais qu'il doit s'agir d'un problème de citation ou de double tiret, mais aucun de ces types de changements ne fonctionne jusqu'à présent, ugh!
tim peterson
4
L' -foption ne fera pas disparaître les erreurs, elle permettra simplement de traiter les instructions SQL non offensantes du fichier. D'après ce que j'ai lu, RDS s'étouffe sur les procédures stockées dans le fichier de vidage. Essayez de créer un fichier de vidage sans procédures de stockage et voyez si cela se charge bien:mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
Ross Smith II
2
- @ Ross, génial qui a fonctionné, ma base de données est là, wow c'est un problème ennuyeux, j'ai l'impression qu'AWS devrait faire quelque chose à ce sujet.
tim peterson
Au moins, je peux charger toutes les données avec l' -foption. La deuxième phase pourrait être de vider uniquement les routines / processus stred, etc. séparément
Kaymaz
134
  1. Ouvrez la console Web RDS.
  2. Ouvrez l'onglet «Groupes de paramètres».
  3. Créez un nouveau groupe de paramètres. Dans la boîte de dialogue, sélectionnez la famille MySQL compatible avec votre version de base de données MySQL, donnez-lui un nom et confirmez. Sélectionnez le groupe de paramètres que vous venez de créer et émettez «Modifier les paramètres».
  4. Recherchez le paramètre «log_bin_trust_function_creators» et définissez sa valeur sur «1».
  5. Enregistrez les modifications.
  6. Ouvrez l'onglet «Instances». Développez votre instance MySQL et lancez l '«Action d'instance» nommée «Modifier».
  7. Sélectionnez le groupe de paramètres que vous venez de créer et activez «Appliquer immédiatement».
  8. Cliquez sur «Continuer» et confirmez les modifications.
  9. Attendez que l'opération "Modification" soit terminée.
  10. Encore une fois, ouvrez l'onglet «Instances». Développez votre instance MySQL et développez l'onglet "Action d'instance" et sélectionnez "Redémarrer".
arun-r
la source
> que fait le point 9 ... vous ajustez votre instance pour utiliser le groupe de paramètres défini précédemment. Pour plus de détails, voir ce billet de blog original de Daniel Ferbers: techtavern.wordpress.com/2013/06/17/…
AndrewL
Cela arrêtera-t-il la réplication de RDS Mysql?
Ramratan Gupta
salut @ arun-r, je passe par les étapes que vous avez expliquées, mais le paramètre 'log_bin_trust_function_creators' n'est pas disponible au cas où. Je pense que quelque chose a changé dans le dernier AWS RDS. Pouvez-vous s'il vous plaît m'aider comment puis-je faire cela maintenant? merci,
Pawan Developers
@RamratanGupta Ça ne s'arrêtera pas
arun-r
1
@ arun-r merci pour votre réponse. J'ai résolu mon problème. En fait, j'ai trouvé log_bin_trust_function_creators dans la liste. mais mon problème est résolu en contactant le support AWS
Pawan Developers
33

Le problème avec les déclencheurs et les procédures stockées dans le fichier de vidage est que ces définitions incluent l'utilisateur par lequel la procédure stockée doit être créée, le DEFINER. L'utilisateur n'existe probablement pas dans le RDS, une erreur est donc générée. Pour pouvoir charger le fichier de vidage, vous pouvez supprimer DEFINER à l'aide de sed ou Perl et créer la procédure stockée / déclencheur avec l'utilisateur qui effectue l'importation.

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql

Vous devriez maintenant pouvoir charger le fichier de vidage fixe

mysql my_database -u my_username -p -h rds_host < mysqldump.fixed.sql

Comme indiqué dans la réponse précédente, vous devez définir le paramètre DB:

log_bin_trust_function_creators = 1
Anders
la source
1
Le nettoyage des définisseurs peut également être effectué avec sed: sed -i 's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g' ./TargetSqlFile.sql
siliconrockstar
14

Pour moi, il n'y avait que 2 commandes dans mon fichier de vidage qui nécessitaient des privilèges SUPER:

  • SET @@GLOBAL.gtid_purged
  • SET @@SESSION.SQL_LOG_BIN

Selon la documentation mysqldump, vous pouvez les désactiver avec --set-gtid-purged=OFF.

Puis en regardant man mysqldump :

Utilisez ON si l'intention est de déployer un nouvel esclave de réplication en utilisant uniquement certaines des données du serveur sauvegardé. Utilisez OFF si l'intention est de réparer une table en la copiant dans une topologie. Utilisez OFF si l'intention est de copier une table entre des topologies de réplication qui sont disjointes et le resteront.

J'ai donc décidé d'ajouter --set-gtid-purged=OFFà ma mysqldumpcommande et ensuite j'ai pu importer avec succès le fichier de vidage résultant.

Yep_It's_Me
la source
1
Ouais, c'était ça. Mon fichier de vidage était relativement petit, j'ai donc supprimé toutes les occurrences de ces 2 commandes.
Zolbayar
6

Comme défini dans la documentation AWS, les déclencheurs, les procédures et les fonctions sont désactivés par défaut car la journalisation binaire est activée par défaut. La désactivation rend votre base de données plus sécurisée, mais si vous l'avez correctement sécurisée via le réseau, cela n'aura pas d'importance.

Suivez ces étapes et votre problème sera résolu https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

Vous ne devez pas non plus utiliser de définisseurs lors de la création de procédures. Une simple commande sed peut le supprimer.

Josh Woodcock
la source
1

Après avoir utilisé la réponse arun-r, si le problème n'est pas résolu, vous devez modifier votre fichier de vidage. C'est simple.

Dans le fichier de vidage, vous trouverez des lignes comme:

DELIMITER ;;
CREATE DEFINER=`username_from_dumped_database`@`host_from_dumped_database` PROCEDURE `procedure_or_function_name`()
BEGIN

Vous devez remplacer:

  • username_from_dumped_database par votre nom d'utilisateur sur la base de données rds.
  • host_from_dumped_databse par %

Je ne sais pas pourquoi mais cette astuce a fonctionné pour moi. Un simple éditeur de texte suffit pour cela.

Damien Frances
la source