Wie behebe ich 1227- und Definer-Fehler, wenn ich mysqldump verwende, um Daten in meine Amazon RDS für MySQL-DB-Instance zu importieren?
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:
- Setze in der benutzerdefinierten DB-Parametergruppe, die du für die DB-Instance erstellt hast, den Parameter log_bin_trust_function_creators auf Wahr.
- 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
Daten aus einer MySQL-DB-Instance mithilfe von Replikation exportieren
- Sprache
- Deutsch
Ähnliche Videos


Relevanter Inhalt
AWS OFFICIALAktualisiert vor 2 Jahren