J'essaie de copier ma base de données mysql d'un Amazon EC2 vers un RDS:
J'ai réussi à faire un mysqldump
de 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..
de diverses manières, mais j'obtiens des erreurs lorsque j'essaie de le faire aussi. Taper mysql > FLUSH privileges;
ne fonctionne pas non plus.
Je suis un débutant mysql, désolé pour une question aussi facile. Pensées?
Pour http://getasysadmin.com/2011/06/Amazon-rds-super-privileges/ , vous devez définir log_bin_trust_function_creators
à 1 dans console AWS , pour charger votre fichier de vidage sans erreur.
Si vous voulez ignorer ces erreurs et charger le reste du fichier de vidage, vous pouvez utiliser le fichier -f
option:
mysql -f my_database -u my_username -p -h
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql
Le -f
signalera des erreurs, mais continuera à traiter le reste du fichier de vidage.
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 avec lequel la procédure stockée doit être créée, le DEFINER. L'utilisateur n'existant probablement pas dans le RDS, une erreur est alors 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/le déclencheur avec l'utilisateur qui effectue l'importation.
Perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql
Maintenant, vous devriez 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
Comme défini dans la documentation AWS, les déclencheurs, procédures et 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ûre, mais si vous êtes correctement sécurisé via le réseau, cela n’a aucune importance.
Suivez ces étapes et votre problème sera résolu https://aws.Amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/
De plus, vous ne devriez pas utiliser de définisseurs lors de la création de procédures. Une simple commande sed peut l'enlever.
En plus de l'édition
log_bin_trust_function_creators = 1
vous devez supprimer tout [~ # ~] le définisseur [~ # ~] de votre fichier de vidage, vérifiez la lien suivant pour [~ # ~] sed [~ # ~] commande qui peut aider à nettoyer votre fichier de vidage SQL .
Pour moi, mon fichier de vidage ne contenait que 2 commandes nécessitant les privilèges SUPER:
SET @@GLOBAL.gtid_purged
SET @@SESSION.SQL_LOG_BIN
Selon le mysqldump docs 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 seulement certaines des données du serveur vidé. Utilisez OFF si vous souhaitez 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 commande mysqldump
et je pourrais ensuite importer avec succès le fichier de vidage obtenu.
Après avoir utilisé arun-r answer, 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.