MySQL / Amazon RDS-Fehler: "Sie haben keine SUPER-Berechtigungen ..."

97

Ich versuche, meine MySQL-Datenbank von einem Amazon EC2 auf ein RDS zu kopieren:

Ich habe erfolgreich eine mysqldumpmeiner Datenbanken in meinem Stammordner erstellt:

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

Dann habe ich versucht, diese .sql-Datei in meine neue RDS-Datenbank zu übertragen:

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

Leider erhalte ich folgende Fehlermeldung:

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)

Ich habe es auf GRANT SUPER..verschiedene Arten versucht, aber ich bekomme Fehler, wenn ich das auch versuche. Das Tippen mysql > FLUSH privileges;funktioniert auch nicht.

Ich bin ein MySQL-Anfänger und entschuldige mich für diese einfache Frage. Gedanken?

tim peterson
quelle
9
Sie können nicht GRANT SUPERauf RDS. RDS bietet keine Möglichkeit, SUPER-Berechtigungen zu erhalten.
Ceejayoz
Verwenden Sie denselben MySQL-Benutzernamen, um einen Speicherauszug zu erstellen und wiederherzustellen (für die Verbindung und das Schlüsselwort DEFINER im Speicherauszug). Das Ändern von log_bin_trust_function_creators ist nicht die gewünschte Lösung. Das Schlimmste ist, in diesem Fall den Parameter -f zu verwenden
ad4s
In meinem Fall enthält meine sqlDatei eine CREATE FUNCTIONAnweisung, die einen privilegierten Benutzer benötigt. siehe dies
Buchhalter م

Antworten:

63

Gemäß http://getasysadmin.com/2011/06/amazon-rds-super-privileges/ müssen Sie log_bin_trust_function_creatorsin der AWS-Konsole 1 festlegen , um Ihre Dump-Datei fehlerfrei zu laden.

Wenn Sie diese Fehler ignorieren und den Rest der Speicherauszugsdatei laden möchten, können Sie die folgende -fOption verwenden:

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

Der -fmeldet Fehler, verarbeitet aber den Rest der Dump-Datei weiter.

Ross Smith II
quelle
Hallo @ Ross, danke dafür. Leider hat die Verwendung -fnicht geholfen. Ich habe den gleichen Fehler bekommen. Bei Verwendung Ihres Links habe ich Probleme mit der Syntax der RDS Cli-Tools. Das heißt, wenn ich gehe, um die Berechtigungen zu ändern, erhalte ich den folgenden Fehler: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
Hier ist mein Befehl, der mir den obigen Fehler gibt: ./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx"Ich weiß, dass es sich um ein Zitat oder ein Double-Dash-Problem handeln muss, aber keine dieser Arten von Änderungen funktioniert bisher, ugh!
Tim Peterson
4
Die -fOption lässt die Fehler nicht verschwinden, sondern ermöglicht lediglich die Verarbeitung der nicht störenden SQL-Anweisungen in der Datei. Nach dem, was ich gelesen habe, verschluckt sich RDS an gespeicherten Prozeduren in der Dump-Datei. Versuchen Sie, eine Dump-Datei ohne Speicherprozeduren zu erstellen, und mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
Ross Smith II
2
- @ Ross, großartig, das hat funktioniert, meine Datenbank ist da, wow, das ist ein nerviges Problem. Ich habe das Gefühl, AWS sollte etwas dagegen tun.
Tim Peterson
Zumindest kann ich mit der -fOption alle Daten laden . Die zweite Phase könnte darin bestehen, nur Routinen / Stred Proc usw. separat zu sichern
Kaymaz
134
  1. Öffnen Sie die RDS-Webkonsole.
  2. Öffnen Sie die Registerkarte „Parametergruppen“.
  3. Erstellen Sie eine neue Parametergruppe. Wählen Sie im Dialogfeld die MySQL-Familie aus, die mit Ihrer MySQL-Datenbankversion kompatibel ist, geben Sie ihr einen Namen und bestätigen Sie. Wählen Sie die gerade erstellte Parametergruppe aus und geben Sie "Parameter bearbeiten" ein.
  4. Suchen Sie nach dem Parameter 'log_bin_trust_function_creators' und setzen Sie seinen Wert auf '1'.
  5. Speichern Sie die Änderungen.
  6. Öffnen Sie die Registerkarte "Instanzen". Erweitern Sie Ihre MySQL-Instanz und geben Sie die "Instanzaktion" mit dem Namen "Ändern" aus.
  7. Wählen Sie die gerade erstellte Parametergruppe aus und aktivieren Sie "Sofort anwenden".
  8. Klicken Sie auf "Weiter" und bestätigen Sie die Änderungen.
  9. Warten Sie, bis der Vorgang "Ändern" abgeschlossen ist.
  10. Öffnen Sie erneut die Registerkarte "Instanzen". Erweitern Sie Ihre MySQL-Instanz, erweitern Sie die Registerkarte "Instanzaktion" und wählen Sie "Neustart".
arun-r
quelle
> Was macht Punkt 9? Sie passen Ihre Instanz an die zuvor definierte Parametergruppe an. Weitere Informationen finden
AndrewL
Stoppt dies die RDS-MySQL-Replikation?
Ramratan Gupta
hi @ arun-r, ich gehe die von Ihnen erläuterten Schritte durch, aber der Parameter 'log_bin_trust_function_creators' ist für den Fall nicht verfügbar. Ich denke, dass sich in den neuesten AWS RDS etwas geändert hat. Können Sie mir bitte helfen, wie kann ich das jetzt tun? danke,
Pawan Developers
@ RamratanGupta Es wird nicht aufhören
arun-r
1
@ arun-r danke für deine antwort. Ich habe mein Problem gelöst. Eigentlich habe ich log_bin_trust_function_creators in der Liste gefunden. Mein Problem wird jedoch durch Kontaktaufnahme mit dem AWS-Support gelöst
Pawan Developers
33

Das Problem mit Triggern und gespeicherten Prozeduren in der Speicherauszugsdatei besteht darin, dass diese Definitionen den Benutzer DEFINER enthalten, von dem die gespeicherte Prozedur erstellt werden soll. Der Benutzer ist höchstwahrscheinlich nicht im RDS vorhanden, sodass ein Fehler ausgelöst wird. Um die Dump-Datei laden zu können, können Sie den DEFINER mit sed oder Perl entfernen und die gespeicherte Prozedur / den gespeicherten Trigger mit dem Benutzer erstellen, der den Import ausführt.

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

Jetzt sollten Sie in der Lage sein, die feste Dump-Datei zu laden

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

Wie in der vorherigen Antwort erwähnt, sollten Sie den DB-Parameter einstellen:

log_bin_trust_function_creators = 1
anders
quelle
1
Das Aufräumen von Definierern kann auch mit sed durchgeführt werden: sed -i 's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g' ./TargetSqlFile.sql
siliconrockstar
14

Für mich gab es nur 2 Befehle in meiner Dump-Datei, für die SUPER-Berechtigungen erforderlich waren:

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

Laut den mysqldump-Dokumenten können Sie diese mit deaktivieren --set-gtid-purged=OFF.

Dann schau dir Mann mysqldump an :

Verwenden Sie ON, wenn ein neuer Replikations-Slave nur mit einigen Daten vom Dump-Server bereitgestellt werden soll. Verwenden Sie AUS, wenn eine Tabelle repariert werden soll, indem Sie sie in eine Topologie kopieren. Verwenden Sie OFF, wenn eine Tabelle zwischen nicht zusammenhängenden und unverbundenen Replikationstopologien kopiert werden soll.

Also habe ich beschlossen, --set-gtid-purged=OFFmeinem mysqldumpBefehl etwas hinzuzufügen , und dann konnte ich die resultierende Dump-Datei erfolgreich importieren.

Yep_It's_Me
quelle
1
Ja, das war es. Meine Dump-Datei war relativ klein, daher habe ich alle Vorkommen dieser beiden Befehle daraus entfernt.
Zolbayar
6

Wie in der AWS-Dokumentation definiert, sind Trigger, Prozeduren und Funktionen standardmäßig deaktiviert, da die binäre Protokollierung standardmäßig aktiviert ist. Durch Deaktivieren wird Ihre Datenbank grundsätzlich sicherer, aber wenn Sie ordnungsgemäß über das Netzwerk gesichert haben, spielt dies keine Rolle.

Befolgen Sie diese Schritte und Ihr Problem wird behoben. Https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

Außerdem sollten Sie beim Erstellen von Prozeduren keine Definierer verwenden. Ein einfacher sed-Befehl kann es entfernen.

Josh Woodcock
quelle
1

Wenn das Problem nach der Verwendung von arun-r nicht behoben ist, müssen Sie Ihre Dump-Datei ändern. Es ist einfach.

In der Dump-Datei finden Sie Zeilen wie:

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

Sie müssen ersetzen:

  • username_from_dumped_database durch Ihren Benutzernamen in der rds-Datenbank.
  • host_from_dumped_databse durch %

Ich weiß nicht warum, aber dieser Trick hat bei mir funktioniert. Dazu reicht ein einfacher Texteditor aus.

Damien Frances
quelle