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, mysqldump
nichts zu produzieren, das SUPER-Privilegien benötigt?
Es scheint, als hätten viele Leute ähnliche Probleme gehabt, als sed
mü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
quelle
log_bin_trust_function_creators
Parameter auf 1 zu ändern , aber immer noch den gleichen Fehler in Zeile 7844 erhalte.--masterdata=2
. Die Zeile wird dann im Dump auskommentiert.Antworten:
Sie benötigen wahrscheinlich
log_bin_trust_function_creators
= 1 auf RDS, aber das ist hier nicht das Problem.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
DEFINER
Deklaration 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
SUPER
Nichtbenutzer 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
DEFINER
Deklaration 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.... 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.
quelle
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"
quelle