La première tentative de migration de EC2 MySQL vers Amazon RDS ne va pas bien - privilèges SUPER

11

J'ai essayé de déplacer une base de données existante de MySQL fonctionnant sur EC2 vers une nouvelle instance Amazon RDS (une expérience pour voir si nous pouvons traverser). Jusqu'à présent, ça ne va pas bien. Je suis bloqué à l'importation initiale avant de configurer la réplication (instructions ici ).

J'ai préparé l'instance RDS comme décrit et je peux me connecter depuis l'instance EC2 en utilisant mysql. J'ai exécuté la commande mysqldump en tant que:

mysqldump --master-data --databases db1 db2 > dump.sql

Ensuite, j'ai tenté de le télécharger sur RDS avec:

mysql -h RDSHost -P 3306 -u rdsuser --password=rdspassword < dump.sql

Le premier problème était à la ligne 22 du dépotoir:

CHANGE MASTER EN MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106;

Cette ligne a provoqué une erreur ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. Pas de problème, juste commenté cette ligne et j'espère la corriger plus tard via mysql.rds_set_external_master (). Retenté le téléchargement, et a obtenu une erreur très similaire: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. La section autour de la ligne 7844 ressemble à ceci:

/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`dev`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `jos_contributor_ids_view` AS select `jos_resource_contributors_view`.`uidNumber` AS `uidNumber` from `jos_resource_contributors_view` union select `jos_wiki_contributors_view`.`uidNumber` AS `uidNumber` from `jos_wiki_contributors_view` */;

En commentant les 2 premières lignes et en ajoutant un «CREATE» à la troisième, j'ai pu dépasser celle-ci. Mais il y a des tonnes de sections comme ça. Y a-t-il un moyen de contourner cela sans toute la modification? Comme une option pour mysqldumpne rien produire qui nécessite des privilèges SUPER?

Il semble que beaucoup de gens aient eu des problèmes similaires, comme devoir courir sedcontre la sortie de mysqldump / mysqlbinlog! Je vais également poster sur le forum AWS - je pense vraiment que RDS devrait avoir un moyen plus tolérant d'importer depuis mysqldump, ou un outil spécifique qui peut être exécuté sur une base de données existante pour créer un vidage qui est conforme à la sécurité RDS. Je me demandais simplement si quelqu'un avait d'autres recettes ou astuces qui pourraient aider ici.

Merci,

Dave

dsl101
la source
Désolé - j'ai oublié de dire que j'ai essayé de changer le log_bin_trust_function_creatorsparamètre à 1, mais j'obtiens toujours la même erreur à la ligne 7844.
dsl101
Ancien message, mais la première erreur que vous pouvez éviter en disant --masterdata=2. La ligne sera ensuite commentée dans le vidage.
Halfgaar

Réponses:

26

Vous avez probablement besoin de log_bin_trust_function_creators= 1 sur RDS, mais ce n'est pas le problème ici.

Vous ne pouvez spécifier une  DEFINER valeur autre que votre propre compte que si vous avez le  SUPER privilège.

- http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html

Lorsqu'un programme stocké (proc, fonction, événement ou déclencheur) est en cours d'exécution, tout ce qu'il fait a les autorisations de l'utilisateur qui l'a défini ou de l'utilisateur explicitement indiqué avec une DEFINERdéclaration. Cela permet, entre autres, aux programmes stockés de permettre à d'autres utilisateurs de faire des choses sur des données qu'ils ne sont pas directement autorisés à manipuler, tant qu'ils sont autorisés à utiliser le programme stocké lui-même.

Ce serait donc une grave vulnérabilité si un non- SUPERutilisateur pouvait créer une procédure avec un définisseur arbitraire, parce que l'utilisateur pouvait augmenter ses privilèges à sa guise.

Cela est également vrai pour les vues, bien sûr, lorsque le contexte de sécurité défini est utilisé, comme dans l'exemple que vous avez publié.

L'une des plus grosses plaintes que j'ai avec RDS est que vous ne pouvez pas avoir SUPER... et maintenant cela peut aussi être l'un des vôtres :) parce que ce fait est la cause du problème que vous rencontrez.

Bien sûr, si j'exécutais un service MySQL géré, je n'en donnerais à personne SUPERnon plus, donc leur modèle de sécurité a du sens, même s'il est parfois difficile à manier.

Si tous vos objets ont le même definer, une solution de contournement serait de restaurer le vidage en utilisant ce compte au lieu de celui que vous utilisez maintenant, mais cela semble peu probable.

Supprimer uniquement la ligne avec la DEFINERdéclaration devrait faire fonctionner le fichier de vidage dans les cas où il apparaît sur une ligne seule, ou vous pouvez utiliser sed ou perl pour modifier le fichier ... une idée que je sais déjà que vous n'aimez pas, mais c'est vraiment une bonne chose à propos de MySQL qu'un tel piratage soit tout à fait légitime, et pas vraiment loin du genre de choses que je dois faire en tant que DBA même dans un environnement non RDS.

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

... peut-être pas la réponse que vous espériez, mais vous pouvez l'exécuter avec votre fichier de vidage et vous devriez vous retrouver avec un fichier légèrement plus utilisable.

Michael - sqlbot
la source
Merci beaucoup pour la réponse complète et pour avoir confirmé ce que je pensais de sed / perl étant la seule solution. L'application que j'utilise est hautement personnalisée Joomla, et bien que open-source, je n'ai pas le temps / les compétences pour l'analyser afin de déterminer si elle passera bien au RDS. Ma pensée était `` essayez-le et voyez '' - mais il semble que la première étape soit la plus difficile - en grande partie en raison des outils de migration d'Amazon inadéquats (à mon avis). Je suis d'accord sur le modèle de sécurité, mais si la sortie par défaut de mysqldump crée autant de problèmes, pourquoi n'ont-ils pas une meilleure solution? Je leur demanderai cela aussi.
dsl101
1
IMPRESSIONNANT. merci beaucoup pour ce script perl. ma sauvegarde était de 4 Go et juste l'ouverture c'était un défi. cela m'a sauvé la journée.
Emile Baizel
1
Excellente explication, excellente réponse et excellente solution! Définiteur stupide.
rkaregaran
4
Merci beaucoup pour votre perl one liner. C'est le seul que j'ai pu trouver qui fonctionne réellement. Beaucoup d'autres sur ces planches ne le font tout simplement pas. Je voterais de nouveau si je le pouvais.
lucian303
1

Dans mon cas, la ligne "CHANGE MASTER TO MASTER_LOG_FILE = ..." du vidage me donnait l'erreur. Cette ligne a été ajoutée par l'option "--master-data" de mysqldump. Dans Amazon AWS, vous devez démarrer la réplication en définissant les détails principaux avec la procédure "mysql.rds_set_external_master" à la place, lisez ici

Je viens donc de prendre des notes de cette ligne "head 22 backup.dump" où la ligne 22 a signalé l'erreur. Ensuite, supprimez-le avant d'importer, pour mon gros fichier, j'utilise: "sed '22d' backup.dump> backup_clean.dump"

Igor Toma
la source