161 Stimmen

DEFINER-Klausel aus MySQL-Dumps entfernen

Ich habe einen MySQL-Dump von einer meiner Datenbanken. Darin gibt es DEFINER-Klauseln, die wie folgt aussehen,

"DEFINER=`root`@`localhost`" 

Diese DEFINER-Klauseln befinden sich nämlich in meinen CREATE VIEW- und CREATE PROCEDURE-Anweisungen. Gibt es eine Möglichkeit, diese DEFINER-Klauseln aus meiner Dump-Datei zu entfernen?

4voto

user2379284 Punkte 31

Der beste Weg, um ohne Probleme zu dumpen und wiederherzustellen:

MYSQL DUMP

mysqldump -h HOST -u USER -pPASSWORD --single-transaction --quick --skip-lock-tables --triggers --routines --events DATABASE | gzip > "DATABASE.sql.gz" &

MYSQL RESTORE

gunzip DATABASE.sql.gz

sed -i 's/DEFINER=[^ ]* / /' DATABASE.sql
sed -i 's/SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;/ /' DATABASE.sql
sed -i 's/SET @@SESSION.SQL_LOG_BIN= 0;/ /' DATABASE.sql
sed -i 's/SET @@GLOBAL.GTID_PURGED='';/ /' DATABASE.sql
sed -i 's/SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;/ /' DATABASE.sql

mysql -h HOST -u USER -pPASSWORD < DATABASE.sql

4voto

itfidds Punkte 71

Ich weiß nicht, ob es hilft, aber ich verwende SQLyog Community Edition, erhältlich unter: -

https://code.google.com/p/sqlyog/wiki/Downloads

Beim Dumpen von Sql oder beim Kopieren in eine andere Datenbank können Sie die Option 'Ignoriere DEFINER' wählen.

Es ist kostenlos und bietet die grundlegenden Funktionen, die viele Menschen benötigen

Es gibt auch eine kostenpflichtige Version, die unter folgender Adresse erhältlich ist: -

https://www.webyog.com/product/sqlyog

Prost

3voto

Cláudio Silva Punkte 657

Wie andere bereits gesagt haben, besteht eine mögliche Lösung darin, die Benutzernamen in DEFINER-Klauseln durch CURRENT_USER zu ersetzen.
Beachten Sie, dass DEFINER sowohl in einfachen SQL-Anweisungen als auch in speziellen Kommentaren, wie in den folgenden Beispielen, berücksichtigt werden müssen:

CREATE DEFINER=`root`@`localhost` FUNCTION...
/*!50013 DEFINER=`MYSQLUSER`@`%` SQL SECURITY DEFINER */
/*!50017 DEFINER=`root`@`localhost`*/

Für mich funktioniert das folgendermaßen:

mysqldump <my-options> | sed -E 's/DEFINER=[^ *]+/DEFINER=CURRENT_USER/g' > dumpfile.sql

3voto

rafwell Punkte 419

Für mich funktioniert das: perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp . Dadurch wurde DEFINER=Root@localhost aus meinem Dump entfernt, und zwar bei jeder Anweisung "create procedure

2voto

I Bajwa PHD Punkte 1620

Hier ist eine vollständige Lösung zum Entfernen von DEFINER-Informationen für MySQL 5.6.x und Linux.(Getestet auf CentOS 6.5 ).

Normalerweise müssen wir folgende Einträge aus dem Mysql-Dump ersetzen (wenn sie zusammen mit Daten und Triggern/Routinen/Funktionen genommen werden).

/*!50013 DEFINER=`MYSQLUSER`@`localhost` SQL SECURITY DEFINER */
/*!50013 DEFINER=`MYSQLUSER`@`%` SQL SECURITY DEFINER */
CREATE DEFINER=`MYSQLUSER`@`%` PROCEDURE `PROCEDURENAME`(
CREATE DEFINER=`MYSQLUSER`@`localhost` PROCEDURE `PROCEDURENAME`(
CREATE DEFINER=`MYSQLUSER`@`%` FUNCTION `FUNCTIONNAME`(
CREATE DEFINER=`MYSQLUSER`@`localhost` FUNCTION `FUNCTIONNAME`(
/*!50003 CREATE*/ /*!50017 DEFINER=`MYSQLUSER`@`%`*/ /*!50003 TRIGGER `TRIGGERNAME`
/*!50003 CREATE*/ /*!50017 DEFINER=`MYSQLUSER`@`localhost`*/ /*!50003 TRIGGER `TRIGGERNAME`

Der Dump wurde mit dem unten stehenden Befehl mysqldump erstellt.

mysqldump -uMYSQLUSER -pPASSWORD DATABASENAME -R > dbdump.sql

Die erforderliche Dump-Datei ohne DEFINER-Informationen kann mit den folgenden drei Befehlen erhalten werden.

Command-1    
sed -i 's|DEFINER=[^*]*\*|\*|g' [PATH/]dbdump.sql

Command-2
find -name [PATH/]dbdump.sql | xargs perl -pi -e "s/ DEFINER=\`MYSQLUSER\`@\`localhost\`//"

Command-3
find -name [PATH/]dbdump.sql | xargs perl -pi -e "s/ DEFINER=\`MYSQLUSER\`@\`%\`//"

Wenn sich die Dump-Datei in Ihrem aktuellen Ordner befindet, ignorieren Sie [PATH/].

Wenn die Daten in den Tabellen sehr groß sind, dann nehmen Sie den Dump in zwei Dateien, in einer Dump-Datei nehmen Sie den Dump mit Daten und in der anderen Dump-Datei auf nehmen Sie den Dump der Skripte nur (Trigger/Funktionen/Prozeduren.) und führen Sie die oben genannten drei Befehle auf der zweiten Dump-Datei (Skripte).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X