Also versuche ich, eine SQL-Datei in rds (1G MEM, 1 CPU) zu importieren. Die SQL-Datei ist wie 1.4G
mysql -h xxxx.rds.amazonaws.com -u Benutzer -ppass --max-allow-packet = 33554432 db <db.sql
Es blieb hängen bei:
ERROR 1227 (42000) at line 374: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
Der tatsächliche SQL-Inhalt ist:
/*!50003 CREATE*/ /*!50017 DEFINER=`another_user`@`1.2.3.4`*/ /*!50003 TRIGGER `change_log_BINS` BEFORE INSERT ON `change_log` FOR EACH ROW
IF (NEW.created_at IS NULL OR NEW.created_at = '00-00-00 00:00:00' OR NEW.created_at = '') THEN
SET NEW.created_at = NOW();
END IF */;;
another_user
ist in rds nicht vorhanden, also mache ich:
GRANT ALL PRIVILEGES ON db.* TO another_user@'localhost';
Immer noch kein Glück.
mysql
amazon-web-services
amazon-rds
Kenpeter
quelle
quelle
DEFINER
wenn der angemeldete Benutzer nicht über dieSUPER
Berechtigung verfügt (die selbst in RDS nicht zulässig ist), eine willkürliche Eskalation von Berechtigungen ermöglichen würde - gespeicherte Programme werden mit den Anmeldeinformationen und Berechtigungen ihrer Benutzer ausgeführtDEFINER
(im Gegensatz zu denen des anrufenden Benutzers - dessenINVOKER
), standardmäßig. Auch bei Serverfehler .sed 's/\sDEFINER=`[^`]*`@`[^`]*`//' -i oldfile.sql
awk
die etwas schneller sein könnte alssed
Wenn Ihre Dump-Datei nicht vorhanden ist
DEFINER
, stellen Sie sicher, dass diese Zeilen auch entfernt werden, wenn sie vorhanden sind, oder kommentiert werden mit--
:Am Anfang:
-- SET @@SESSION.SQL_LOG_BIN= 0; -- SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
Am Ende:
-- SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
quelle
--set-gtid-purged=OFF
Ihremmysqldump
Befehl hinzufügen . Gefunden hier: stackoverflow.com/a/56251925Ein weiterer nützlicher Trick besteht darin, mysqldump mit der Option --set-gtid-purged = OFF aufzurufen, bei der die folgenden Zeilen nicht in die Ausgabedatei geschrieben werden:
SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ ''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
Ich bin mir nicht sicher über den DEFINER.
quelle
SET @@GLOBAL.GTID_MODE = OFF;
in MySql Workbench auf der exportierenden Seite aus der QuellendatenbankNur ein zusätzliches MacOS-Update für hjpotter92.
Um
sed
das Muster in MacOS zu erkennen, müssen Sie vor dem=
Zeichen einen Backslash einfügen, wie folgt :quelle
Problem : Sie versuchen, Daten (mithilfe der mysqldump-Datei) in Ihre mysql-Datenbank zu importieren, aber anscheinend haben Sie keine Berechtigung, diesen Vorgang auszuführen.
Lösung : Angenommen, Ihre Daten werden in Ihrer MySQL-Datenbank migriert, gesetzt und aktualisiert. Erstellen Sie mit mysqldump einen Snapshot und exportieren Sie ihn in eine Datei
mysqldump -u [username] -p [databaseName] --set-gtid-purged=OFF > [filename].sql
Stellen Sie anschließend mit dem Benutzer root eine Verbindung zu Ihrer MySQL her, erteilen Sie Berechtigungen, leeren Sie sie und überprüfen Sie, ob Ihre Benutzerrechte korrekt aktualisiert wurden.
mysql -u root -p UPDATE mysql.user SET Super_Priv='Y' WHERE user='johnDoe' AND host='%'; FLUSH PRIVILEGES; mysql> SHOW GRANTS FOR 'johnDoe'; +------------------------------------------------------------------+ | Grants for johnDoe | +------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `johnDoe` | | GRANT ALL PRIVILEGES ON `db1`.* TO `johnDoe` | +------------------------------------------------------------------+
Laden Sie nun die Daten neu und der Vorgang sollte zulässig sein .
quelle
.sql.gz
Entfernen Sie zum Importieren der Datenbankdatei im Format den Definierer und importieren Sie ihn mit dem folgenden BefehlExportieren Sie zuvor die Datenbank im Format .sql.gz mit dem folgenden Befehl.
mysqldump -u user -p old_db | gzip -9 > path_to_db_exported.sql.gz;
Importieren Sie die exportierte Datenbank und entfernen Sie den Definierer mit dem folgenden Befehl.
zcat path_to_db_exported.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db
quelle
Stellen Sie beim Wiederherstellen der Sicherung sicher, dass Sie denselben Benutzernamen für den alten und den neuen verwenden.
quelle
Vollständige Lösung
Alle oben genannten Lösungen sind in Ordnung. Und hier werde ich alle Lösungen kombinieren, damit es für alle Situationen funktioniert.
Für Linux und Mac
Öffnen Sie für Windows Atom oder Notepad ++ Ihre Dump-SQL-Datei mit Atom oder Notepad ++, drücken Sie Strg + F,
suchen Sie das Wort DEFINER und entfernen Sie die Zeile DEFINER =
admin
@%
(oder für Sie möglicherweise etwas anders) von überall und speichern Sie die Datei.Wie zum Beispiel
vor dem Entfernen dieser Zeile: CREATE DEFINER =
admin
@%
PROCEDUREMyProcedure
Nach dem Entfernen dieser Zeile: CREATE PROCEDURE
MyProcedure
Beispiel: Öffnen Sie Dump2020.sql in Atom, drücken Sie Strg + F, suchen Sie nach SET @@ SESSION.SQL_LOG_BIN = 0 und entfernen Sie diese Zeile.
SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ ''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
quelle
Ich habe kommentiert, dass alle Zeilen
SET
in der*.sql
Datei beginnen und es hat funktioniert.quelle
* Die Antwort gilt möglicherweise nur für MacOS *
Beim Versuch, eine SQL-Datei in einen Docker-Container zu importieren, wurde die folgende Fehlermeldung angezeigt:
Während ich einige der anderen Vorschläge ausprobierte, erhielt ich auf meinem MacOS (osx) den folgenden Fehler.
Schließlich hat der folgende Befehl aus dieser Ressource mein Problem "Zugriff verweigert" behoben.
So konnte ich in die Docker-Datenbank importieren mit:
Hoffe das hilft! :) :)
quelle
Auf der Serverseite muss der Serverparameter "log_bin_trust_function_creators" auf "on" gesetzt werden. Diese finden Sie leicht auf der linken Seite Klinge, wenn es azurblaue Maria db ist.
quelle
Erklärung
ist ein Problem in Ihrem Backup-Dump.
Die Lösung, die Sie umgehen können, besteht darin, alle Einträge aus der SQL-Dump-Datei zu entfernen und Daten aus der GCP-Konsole zu importieren.
Versuchen Sie, eine neue Datei zu importieren (NEW-CLEANED-DUMP.sql).
quelle