Ich habe einen MySQL-Speicherauszug einer meiner Datenbanken. Darin gibt es DEFINER-Klauseln, die aussehen wie:
"DEFINER=`root`@`localhost`"
Diese DEFINER-Klauseln befinden sich nämlich in meinen Anweisungen CREATE VIEW und CREATE PROCEDURE. Gibt es eine Möglichkeit, diese DEFINER-Klauseln aus meiner Dump-Datei zu entfernen?
Antworten:
Ich glaube nicht, dass es eine Möglichkeit gibt, das Hinzufügen von
DEFINER
s zum Dump zu ignorieren . Es gibt jedoch Möglichkeiten, sie zu entfernen, nachdem die Speicherauszugsdatei erstellt wurde.Öffnen Sie die Dump-Datei in einem Texteditor und ersetzen Sie alle Vorkommen von
DEFINER=root@localhost
durch eine leere Zeichenfolge ""Bearbeiten Sie den Speicherauszug (oder leiten Sie die Ausgabe weiter) mit
perl
:Leiten Sie den Ausgang durch
sed
:quelle
sed -E 's/DEFINER=
[^]+
@[^
] +/DEFINER=CURRENT_USER/g' dump.sql > new_dump.sql
Es hat den Vorteil, Einschränkungen / Zugriffskontrolle beizubehalten .sed
Befehl entfernt die DEFINER-Klausel nicht aus Prozeduren und Funktionen. Hier ist die erweiterte Version, die Ansichten, Trigger, Prozeduren und Funktionen behandelt:sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*PROCEDURE/PROCEDURE/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*FUNCTION/FUNCTION/'
Sie können mit SED entfernen
In MacOS:
quelle
-i extension
"Bearbeiten Sie Dateien direkt und speichern Sie Sicherungen mit der angegebenen Erweiterung. Wenn eine Erweiterung mit der Länge Null angegeben wird, wird keine Sicherung gespeichert. Es wird nicht empfohlen, eine Erweiterung mit der Länge Null anzugeben, wenn direkte Bearbeitung von Dateien, da Sie in Situationen, in denen der Speicherplatz erschöpft ist, Beschädigungen oder teilweise Inhalte riskieren usw. "Seit MySQL-Version 5.7.8 können Sie die
--skip-definer
Option mit MySQL-Pumpe verwenden, z.Siehe das aktualisierte MySQL-Handbuch unter http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer
quelle
mysqldump
und istmysqlpump
- hier ist eine verwandte Frage: dba.stackexchange.com/questions/118846/mysqldump-vs-mysqlpumpinformation_schema.user
, und dies ist nicht immer für alle Benutzer lesbarIch habe diese Ideen verwendet, um die DEFINER-Klausel aus meiner eigenen mysqldump-Ausgabe zu entfernen, aber ich habe einen einfacheren Ansatz gewählt:
Entfernen Sie einfach das
!
vor dem Code und DEFINER, und der Rest des Kommentars wird zu einem regulären Kommentar.Beispiel:
ist hilflos gemacht, so wenig wie dies zu tun ..
Der einfachste reguläre Ausdruck ist jedoch das Entfernen des! und die Zahlen
Das entfernt
!#### DEFINER
und ersetzt durch DEFINER ... Sie könnten DEFINER auch entfernen, es spielt keine Rolle - sobald das "!" ist wegquelle
Nach den Empfehlungen des anderen finden Sie hier ein Beispiel für das Entfernen des DEFINER aus dem Speicherauszug, nachdem der Speicherauszug beendet wurde:
quelle
user
@localhost
* / / *! 50003 Trigger my_triggername BEVOR INSERT ON my_table FÜR JEDE REIHE .... * / ;; undgrep -v
wird diese Zeilen vollständig löschen. (obwohl 50017! = 50013)Wie andere bereits erwähnt haben, ist es nicht allzu komplex, den Definierer mit einem regulären Ausdruck zu entfernen. Aber die anderen Beispiele haben mir die Ansichtsdefinitionen entzogen.
Dies ist der reguläre Ausdruck, der für mich funktioniert hat:
quelle
*/
. MySQL 5.6.31.Für eine automatisierte Lösung könnten Sie sich ansehen
mysqlmigrate
. Es ist ein Bash-Wrappermysqldump
, mit dem Sie Datenbanken migrieren und die DEFINER-Anweisungen ignorieren können. Beispiel:http://thesimplesynthesis.com/post/mysqlmigrate (oder GitHub )
Andernfalls ist ein Befehl wie Abhay erforderlich:
quelle
Eine weitere Option unter OSX zum Entfernen von Definierern in der Datei:
quelle
Sie sollten die Antwort hier: /dba/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079
Der beste Weg, um dieses Problem zu beheben, besteht meiner Meinung nach darin, keine zusätzliche Analyse von Zeichenfolgen mit sed oder grep oder einer anderen zu erstellen. Stattdessen kann mysqldump durch Hinzufügen von --single-transaction einen guten Speicherauszug generieren
quelle
Eine schnelle Möglichkeit, dies zu tun, besteht darin, die Ausgabe von mysqldump durch sed zu leiten , um die
DEFINER
in bedingten Kommentaren eingeschlossenen Anweisungen zu entfernen . Ich verwende dies, umDEFINER
ausCREATE TRIGGER
Anweisungen zu entfernen , aber Sie können die Versionsnummer des Bedingungskommentars im regulären Ausdruck an Ihre Zwecke anpassen.quelle
Ich bin mir nicht sicher, ob es hilft, aber ich verwende SQLyog Community Edition, verfügbar unter: -
https://code.google.com/p/sqlyog/wiki/Downloads
Wenn Sie SQL sichern oder in eine andere Datenbank kopieren, können Sie DEFINER ignorieren.
Es ist kostenlos und bietet die grundlegenden Funktionen, die viele Menschen benötigen
Es gibt auch eine kostenpflichtige Version von: -
https://www.webyog.com/product/sqlyog
Prost
quelle
Für mich funktioniert das :
perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp
. Dadurch wurde DEFINER = root @ localhost bei jeder Erstellung einer Prozedur aus meinem Speicherauszug entferntquelle
Hier ist eine vollständige funktionierende Lösung zum Entfernen von DEFINER-Informationen für
MySQL 5.6.x
und Linux (getestet amCentOS 6.5
).Normalerweise müssen wir die folgenden Einträge aus dem MySQL-Dump ersetzen (wenn sie zusammen mit Daten und Triggern / Routinen / Funktionen verwendet werden).
Der Dump wurde mit dem folgenden Befehl mysqldump erstellt.
Die erforderliche Dump-Datei ohne DEFINER-Informationen kann mit den folgenden drei Befehlen abgerufen werden.
Wenn sich die Dump-Datei in Ihrem aktuellen Ordner befindet, ignorieren Sie [PATH /].
Wenn die Daten in Tabellen sehr groß sind, nehmen Sie den Speicherauszug in zwei Dateien, in einer Speicherauszugsdatei den Speicherauszug mit Daten und in einer anderen Speicherauszugsdatei nur den Speicherauszug der Skripte (Trigger / Funktionen / Prozeduren) und führen Sie die obigen drei aus Befehle in der 2. Dump-Datei (Skripte).
quelle
Ersetzen Sie alle Ihre Definierer-Benutzer durch CURRENT_USER. In meinem Gradle-Skript, das das Backup erstellt, sieht mein Ersetzungsskript folgendermaßen aus:
Das heißt wirklich nur ANT. Dann müssen Sie sich keine Sorgen machen.
quelle
Auf Linux-Computern können Sie diesen Einzeiler verwenden:
Sie müssen nur fett gedruckte Zeichenfolgen durch Ihre DB-Benutzeranmeldeinformationen und das Datenbanknamen- / Like-Muster ersetzen.
Weitere Informationen hier: http://blog.novoj.net/2014/05/16/recreate-mysql-views-without-definer-one-liner-solution-linux/
quelle
Der einzige Weg, wie ich es unter Windows zum Laufen bringen kann:
Installieren Sie http://gnuwin32.sourceforge.net/ haben sed in der Befehlszeile , und fügen Sie den Windows - Pfad ein : D: \ Programme \ GetGnuWin32 \ ist;
quelle
Vielen Dank für die Hinweise. Da ich faul bin, habe ich ein Skript mit dem Namen "MYsqldump" geschrieben:
quelle
Für so etwas wie:
Versuche dies:
quelle
Öffnen Sie Ihre Datenbank mit einem beliebigen Editor, den ich mit Notepad ++ verwendet habe.
Finde alle teste das
DEFINER=root@localhost
und ersetze es durch nichts (""
) IE. Lösche es.Anschließend können Sie es auf einen beliebigen Host importieren.
quelle
Der einfachste reguläre Ausdruck, der für mich mit allen Objekten funktioniert, ist:
Beachten Sie, dass dies sein
quote-names
mussTRUE
(was standardmäßig der Fall ist).Hoffe, dass in neueren Versionen der
--skip-definer
in mysqlpump in Version 5.7 eingeführte Schalter auch zu mysqldump kommt.quelle
Ich habe das PowerShell-Skript verwendet, um alle Zeilen zu entfernen mit
DEFINER
:get-content $ file_in_full_path | select-string -pattern $ line_string_delete -notmatch | Out-File-width 1000000000 -Encoding Default $ file_out_full_path
quelle
Da für mich nichts funktionierte, musste ich meinen eigenen regulären Ausdruck schreiben.
Versuchen Sie, Ihre Datenbank in eine Datei, eine
cat
ganze Datei undgrep
nur Ihre Definiereranweisungen zu speichern, um sie anzuzeigen.cat file.sql | grep -o -E '. {, 60} DEFINER. {, 60}'
Schreiben Sie Ihre Regex
Pipe deine Müllkippe mit diesem Regex in sed. Zum Beispiel lautet meine Aussage:
mysqldump | sed -Es // *! 500 [0-9] [0-9] DEFINER =. +? * /// '| sed -Es / DEFINER =
?[^ ]+?
? @?[^ ]+?
? // 'Profitieren!
quelle
remove_definers.bat:
quelle