163 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

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

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

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

Ryan Shillington Punkte 19095

Ersetzen Sie alle Ihre Definer-Benutzer durch CURRENT_USER. In meinem gradle-Skript, das das Backup erstellt, sieht mein Ersetzungsskript wie folgt aus:

ant.replaceregexp(file: "$buildDir/sql/setupDB.sql", match: "`${project.ext.prod_db_username}`@`%`", replace: "CURRENT_USER", byline: true);

was eigentlich nur ein Anruf bei ANT ist. Dann müssen Sie sich nicht darum kümmern.

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