Direkt zum Inhalt

Wie behebe ich 1227- und Definer-Fehler, wenn ich mysqldump verwende, um Daten in meine Amazon RDS für MySQL-DB-Instance zu importieren?

Lesedauer: 3 Minute
0

Wenn ich mysqldump verwende, um Daten in eine Amazon Relational Database Service (Amazon RDS) für MySQL-DB-Instance zu importieren, erhalte ich einen 1227- oder Definer-Fehler.

Lösung

Überprüfe das Binärprotokoll, um die Datenbankereignisse und Änderungen zu überprüfen. Weitere Informationen findest du unter Das Binärprotokoll auf der MySQL-Website.

Error 1227

Wenn du die Binärprotokollierung aktivierst und die mysqldump-Datei ein gespeichertes Objekt enthält, z. B. einen Trigger, eine Ansicht, eine Funktion oder ein Ereignis, erhältst du möglicherweise den folgenden Fehler:

„Error: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Access denied; you need (at least one of) the %s privilege(s) for this operation.“

Führe die folgenden Schritte aus, um diesen Fehler zu beheben:

  1. Setze in der benutzerdefinierten DB-Parametergruppe, die du für die DB-Instance erstellt hast, den Parameter log_bin_trust_function_creators auf Wahr.
  2. Entferne die Befehlszeilen wie SET @ @SESSION .SQL_LOG_BIN= 0; aus der Dump-Datei, bevor du die Datei für die Instance ausführst.

Definer-Fehler

Ein Definer-Fehler tritt auf, wenn MySQL versucht, ein Objekt als Datenbankbenutzer zu erstellen, das in der Zieldatenbank nicht existiert. Oder ein Definer tritt auf, wenn MySQL versucht, einen Benutzer für den localhost zu erstellen, weil Amazon RDS keine superuser-Berechtigungen hat. Möglicherweise wird ein Fehler ähnlich dem folgenden angezeigt:
„Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW“ error message.“

Gehe wie folgt vor, um den Fehler zu beheben.

Entferne die DEFINER-Zeile

Suche die DEFINER-Zeile und lösche sie dann:

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

Beispielausgabe:

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

Die DEFINER-Benutzer umbenennen

Benenne Root in masteruser und localhost in %host um:

/*!50017 DEFINER=`masteruser`@`%host`*/

Beispielausgabe:

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

Hinweis: Du kannst % als Platzhalter für alle Hosts verwenden.

Die DEFINER-Option entfernen und dann die Dump-Datei erstellen oder sie erneut erstellen

Das MySQL-Dump-Hilfsprogramm enthält keine Option zum Entfernen von DEFINER. Einige MySQL-Client-Dienstprogramme bieten die Option, den DEFINER zu ignorieren, wenn du logische Backups erstellst, aber diese Funktion ist standardmäßig nicht verfügbar. Um festzustellen, ob die Option zum Ignorieren von DEFINER verfügbar ist, lies dir die Dokumentation des bevorzugten MySQL-Clients durch. Der MySQL-Befehlszeilenclient kann den DEFINER nicht ausschließen. Du kannst den Client jedoch mit Tools von Drittanbietern verwenden, um den DEFINER zu entfernen oder den Benutzernamen und den Host zu suchen und zu ersetzen.

Führe den folgenden Befehl aus, um die DEFINER-Zeile in Linux, macOS oder Windows Subsystem für Linux (WSL) zu suchen und zu löschen:

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

Führe den folgenden Befehl aus, um den Benutzernamen und den Host in Linux, macOS oder WSL zu finden und zu ersetzen:

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

Hinweis: Ersetze masteruser durch den Namen des Amazon RDS-Hauptbenutzers.

Ähnliche Informationen

Amazon RDS für MySQL

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