Erster Versuch, EC2 MySQL auf Amazon RDS zu migrieren, funktioniert nicht - SUPER-Berechtigungen

11

Ich habe versucht, eine vorhandene Datenbank von MySQL, das unter EC2 ausgeführt wird, auf eine neue Amazon RDS-Instanz zu verschieben (ein Experiment, um zu sehen, ob wir sie verschieben können). Bisher läuft es nicht gut. Ich stecke beim ersten Import fest, bevor ich die Replikation einrichte (Anweisungen hier ).

Ich habe die RDS-Instanz wie beschrieben vorbereitet und kann über MySQL von der EC2-Instanz aus eine Verbindung herstellen. Ich habe den Befehl mysqldump wie folgt ausgeführt:

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

Dann wurde versucht, es auf RDS hochzuladen mit:

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

Das erste Problem war in Zeile 22 der Müllkippe:

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

Diese Zeile verursachte einen Fehler ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. Kein Problem, habe diese Zeile einfach auskommentiert und hoffe, sie später über mysql.rds_set_external_master () zu beheben. Der Upload wurde wiederholt und es wurde ein sehr ähnlicher Fehler angezeigt : ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. Der Abschnitt um die Linie 7844 sieht folgendermaßen aus:

/*!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` */;

Indem ich die ersten beiden Zeilen auskommentierte und der dritten ein 'CREATE' hinzufügte, konnte ich diese hinter mich bringen. Aber es gibt Unmengen solcher Abschnitte. Gibt es einen Ausweg ohne all die Bearbeitung? Wie eine Option, mysqldumpnichts zu produzieren, das SUPER-Privilegien benötigt?

Es scheint, als hätten viele Leute ähnliche Probleme gehabt, als sedmüssten sie gegen die Ausgabe von mysqldump / mysqlbinlog laufen! Ich werde auch im AWS-Forum posten - ich denke wirklich, RDS sollte eine tolerantere Art des Imports aus mysqldump haben oder ein bestimmtes Tool, das gegen eine vorhandene Datenbank ausgeführt werden kann, um einen Speicherauszug zu erstellen, der eine Beschwerde mit RDS-Sicherheit darstellt. Ich habe mich nur gefragt, ob jemand andere Rezepte oder Tricks hat, die hier helfen könnten.

Vielen Dank,

Dave

dsl101
quelle
Entschuldigung - ich habe vergessen zu sagen, dass ich versucht habe, den log_bin_trust_function_creatorsParameter auf 1 zu ändern , aber immer noch den gleichen Fehler in Zeile 7844 erhalte.
dsl101
Alter Beitrag, aber der erste Fehler, den Sie vermeiden können, indem Sie sagen --masterdata=2. Die Zeile wird dann im Dump auskommentiert.
Halfgaar

Antworten:

26

Sie benötigen wahrscheinlich log_bin_trust_function_creators= 1 auf RDS, aber das ist hier nicht das Problem.

Sie können DEFINER nur dann einen anderen Wert als Ihr eigenes Konto angeben,  wenn Sie über die SUPER Berechtigung verfügen  .

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

Wenn ein gespeichertes Programm (proc, function, event oder trigger) ausgeführt wird, verfügt alles, was es tut, über die Berechtigungen des Benutzers, der es definiert hat, oder des Benutzers, der ausdrücklich mit einer DEFINERDeklaration angegeben wurde. Auf diese Weise können gespeicherte Programme unter anderem anderen Benutzern ermöglichen, Daten zu bearbeiten, für die sie keine direkte Manipulationsberechtigung haben, sofern sie die Berechtigung haben, das gespeicherte Programm selbst zu verwenden.

Es wäre dann eine schwerwiegende Sicherheitslücke, wenn ein SUPERNichtbenutzer eine Prozedur mit einem beliebigen Definierer erstellen könnte, da der Benutzer seine Berechtigungen nach Belieben erweitern könnte.

Dies gilt natürlich auch für Ansichten, wenn der definierte Sicherheitskontext verwendet wird, wie in dem von Ihnen veröffentlichten Beispiel.

Eine der größten Beschwerden, die ich bei RDS habe, ist, dass Sie keine haben können SUPER... und jetzt kann es auch eine von Ihnen sein :), weil diese Tatsache die Ursache für das Problem ist, das Sie haben.

Wenn ich einen verwalteten MySQL-Dienst ausführen würde, würde ich natürlich auch niemandem etwas geben SUPER, daher ist das Sicherheitsmodell sinnvoll, auch wenn es manchmal unhandlich ist.

Wenn alle Ihre Objekte denselben Definierer haben, besteht eine Problemumgehung darin, den Speicherauszug mit diesem Konto anstelle des jetzt verwendeten Kontos wiederherzustellen. Dies scheint jedoch unwahrscheinlich.

Wenn Sie nur die Zeile mit der DEFINERDeklaration löschen, sollte das Dumpfile in Fällen funktionieren, in denen es in einer Zeile für sich selbst angezeigt wird, oder Sie können sed oder perl verwenden, um die Datei zu ändern ... eine Idee, von der ich bereits weiß, dass Sie sie nicht mögen. Aber es ist wirklich eine schöne Sache an MySQL, dass solche Hackerangriffe durchaus legitim sind und nicht wirklich weit entfernt von den Dingen, die ich als DBA selbst in einer Nicht-RDS-Umgebung tun muss.

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

... möglicherweise nicht die Antwort, auf die Sie gehofft haben, aber Sie könnten das gegen Ihr Dumpfile ausführen und sollten eine etwas benutzerfreundlichere Datei erhalten.

Michael - sqlbot
quelle
Vielen Dank für die umfassende Antwort und für die Bestätigung meiner Meinung nach sed / perl als einzige Lösung. Die App, die ich verwende, ist hochgradig angepasstes Joomla, und obwohl Open Source, habe ich nicht die Zeit / Fähigkeit, sie zu analysieren, um herauszufinden, ob sie sich gut auf RDS übertragen lässt. Mein Gedanke war "Probieren Sie es aus und sehen Sie" - aber es scheint, dass der erste Schritt der schwierigste ist - nicht zuletzt aufgrund der (meiner Ansicht nach) unzureichenden Migrationstools von Amazon. Ich stimme dem Sicherheitsmodell zu, aber wenn die Standardausgabe von mysqldump so viele Probleme verursacht, warum haben sie dann keine bessere Lösung? Ich werde das auch von ihnen verlangen.
dsl101
1
GENIAL. Vielen Dank für dieses Perl-Skript. Mein Backup war 4+ GB und das Öffnen war eine Herausforderung. das hat mir den Tag gerettet.
Emile Baizel
1
Tolle Erklärung, tolle Antwort und tolle Lösung! Blöder Definierer.
Rkaregaran
4
Vielen Dank für Ihren Perl One Liner. Es ist das einzige, das ich finden konnte, das tatsächlich funktioniert. Viele andere auf diesen Boards tun dies einfach nicht. Ich würde wieder abstimmen, wenn ich könnte.
Lucian303
1

In meinem Fall war die Zeile "CHANGE MASTER TO MASTER_LOG_FILE = ..." im Dump, die mir den Fehler gab. Diese Zeile wurde durch die Option "--master-data" von mysqldump hinzugefügt. In Amazon AWS müssen Sie die Replikation starten, indem Sie die Masterdetails mit der Prozedur "mysql.rds_set_external_master" festlegen. Lesen Sie stattdessen hier

Also habe ich nur Notizen zu dieser Zeile "head 22 backup.dump" gemacht, in der die Zeile 22 im Fehler gemeldet wurde. Entfernen Sie es dann vor dem Import, für meine große Datei verwende ich: "sed '22d' backup.dump> backup_clean.dump"

Igor Toma
quelle