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?

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).

1voto

Lê Công Danh Punkte 11
  1. Öffnen Sie Ihre Datenbank mit einem beliebigen Editor, ich habe Notepad++ verwendet,

  2. alle Tests finden, die DEFINER=root@localhost und ersetzen sie durch nichts( "" ) IE. löschen.

Dann können Sie sie auf jeden beliebigen Host importieren.

1voto

Novoj Punkte 319

Auf Linux-Rechnern können Sie diesen Einzeiler verwenden:

mysql -uuser -ppwd -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL and table_schema like 'mydb%'" | mysql -uuser -ppwd -A --skip-column-names | sed -rn 's/.*?VIEW ([^\s]+?) (AS .*?)\s([^\s]+?)\s([^\s]+?)/DROP VIEW \1;\nCREATE VIEW \1 \2;/p' | mysql -uuser -ppwd -A --skip-column-names

Sie müssen lediglich die fettgedruckten Zeichenfolgen durch Ihre DB-Benutzeranmeldedaten und den Datenbanknamen bzw. das entsprechende Muster ersetzen.

Mehr Informationen hier: https://blog.novoj.net/posts/2014-05-16-recreate-mysql-views-without-definer-one-liner-solution-linux/

1voto

R.Canaro Punkte 11

Ich danke Ihnen allen für die Hinweise. Aus Faulheit habe ich ein Skript namens: "MYsqldump" :

DB=$1
HOST=$2
USER=$3
MYSQLDUMP='/usr/bin/mysqldump'
PARAMS="--complete-insert --disable-keys=0 --extended-insert=0 --routines=0 --skip-comments"
DAY=`date +%d`
MONTH=`date +%m`
YEAR=`date +%Y`
FILE=$DB.$DAY-$MONTH-$YEAR.sql

    if (( $# < 3 )) ; then
        echo ""
        echo "usage: MYsqldump <db> <host> <user>"
        echo ""
        exit 1
    fi

    $MYSQLDUMP -h $HOST -u $USER -p  $PARAMS $DB | grep -v '/*!50013 DEFINER' > $FILE

1voto

impactaweb Punkte 11

Für etwas wie:

DELIMITER ;;
CREATE DEFINER=\`mydb\`@\`localhost\` FUNCTION \`myfunction\`() RETURNS int(11)
begin
(...)
end ;;

Versuchen Sie dies:

mysqldump --force --routines --opt --user=myuser --databases mydb | sed -e 's/DEFINER=\`.\*\`@\`.\*\`\\ //g'

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