Wie kann ich 1227- und Definer-Fehler beim Importieren von Daten in meine Amazon RDS for MySQL DB-Instanz mit mysqldump beheben?

Lesedauer: 3 Minute
0

Wenn ich versuche, mit mysqldump Daten in eine Amazon Relational Database Service (Amazon RDS) for MySQL DB-Instanz zu importieren, erhalte ich eine Fehlermeldung, die einer der folgenden ähnelt:

Error: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Access denied; you need (at least one of) the %s privilege(s) for this operation.
Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

Kurzbeschreibung

Ein 1227-Fehler tritt auf, wenn in der Datenbank das Binärlog aktiviert ist und die ** ** mysqldump-Datei ein gespeichertes Objekt enthält, z. B. einen Trigger, eine Ansicht, eine Funktion oder ein Ereignis. Weitere Informationen finden Sie unter Binary Log.

Definer-Fehler werden ausgelöst, wenn MySQL versucht, ein Objekt unter einem Datenbankbenutzer zu erstellen, dieser Datenbankbenutzer jedoch in der Zieldatenbank nicht existiert. Möglicherweise erhalten Sie einen ähnlichen Fehler, wenn MySQL versucht, einen Benutzer für localhost zu erstellen, eine Aktion, die für Amazon RDS nicht zulässig ist. Das liegt daran, dass Amazon RDS keine Superuser-Berechtigungen hat.

Auflösung

Fehler 1227 beheben

  1. Setzen Sie den Parameter log\ _bin\ _trust\ _function\ _creators ** in der benutzerdefinierten DB-Parametergruppe, die Sie für Ihre DB-Instance erstellen, auf ** true.

  2. Einige Befehle, die normalerweise in MySQL-Dump-Dateien enthalten sind, wie zum Beispiel "**SET @ @SESSION .SQL\ _LOG\ _BIN= 0; ** „, sind in RDS nicht zulässig. Diese Zeilen sollten aus der Dump-Datei gelöscht oder in der Dump-Datei kommentiert werden, bevor die Datei für die RDS-Instanz ausgeführt wird.

Definer-Fehler beheben

Definer-Fehler können auf verschiedene Arten behoben werden:

  • Entferne die Definierzeile
  • Benennen Sie die Definer-Benutzer um
  • Erstellen Sie die Dump-Datei ohne die Definer-Option oder erstellen Sie sie erneut

**Entferne die Definierzeile **

/*!50017 DEFINER=`root`@`localhost`*/

Die Zeile zeigt jetzt eine Ausgabe, die der folgenden ähnelt:

/*!50003 CREATE*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

**Benennen Sie die Definer-Benutzer um **

Benennen Sie das ** Stammverzeichnis ** in ** masteruser ** und ** localhost in %host ** um ** **:

/*!50003 CREATE*/ /*!50017 DEFINER=`masteruser`@`%`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

**Hinweis:**Sie können% als Platzhalter für alle Hosts verwenden.

**Erstellen Sie die Dump-Datei ohne die Definer-Option oder erstellen Sie sie erneut. **

Das MySQL-Dump-Hilfsprogramm bietet keine Möglichkeit, einen DEFINER zu entfernen. Einige MySQL-Clients bieten die Option, den Definer zu ignorieren, wenn ein logisches Backup erstellt wird, aber diese Option ist standardmäßig nicht verfügbar. Lesen Sie in der Dokumentation Ihres bevorzugten MySQL-Clients nach, ob die Option zum Ignorieren des DEFINERS verfügbar ist. Der MySQL-Befehlszeilenclient kann den Definer nicht ausschließen. Der Client kann jedoch mit Tools von Drittanbietern verwendet werden, um den DEFINER zu entfernen oder den Benutzernamen und den Host zu finden und zu ersetzen

Die folgenden Beispiele zeigen, wie der DEFINER in Linux, macOS oder dem Windows-Subsystem für Linux (WSL) entfernt werden kann:

Entfernen:

sed -i -e 's/DEFINER=`root`@`localhost`//g' dump.sql

Suchen und ersetzen:

sed -i -e 's/DEFINER=`root`@`localhost`/DEFINER=`masteruser`@`%`/g' dump.sql

**Hinweis:**Ersetzen Sie den Wert für ** masteruser ** durch den Namen Ihres Amazon RDS-Masterbenutzers.


Ähnliche Informationen

MySQL auf Amazon RDS

Exportieren von Daten aus einer MySQL-DB-Instance mithilfe von Replikation