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?

1voto

Artur Kędzior Punkte 3765

Die einzige Möglichkeit, wie ich es unter Windows zum Laufen bringen konnte:

Installieren Sie http://gnuwin32.sourceforge.net/ zu haben sed in der Befehlszeile und fügen Sie es dem Windows PATH: D:\programs\GetGnuWin32\bin ;

sed -i "s|DEFINER=`mydbuser`@`%%` SQL SECURITY DEFINER||g" "D:/prod_structure.sql"

sed -i "s|DEFINER=`mydbuser`@`%%`||g" "D:/prod_structure.sql"

mysqldump -P{port} -h{host} -u{user} -p{password} --routines --no-data --lock-tables=false database_prod > D:\prod_structure.sql

0voto

Alen Punkte 49

Ich habe ein PowerShell-Skript zum Entfernen aller Zeilen 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

0voto

Franc Drobnič Punkte 885

Die einfachste Regex, die für mich mit allen Objekten funktioniert, ist:

sed 's/DEFINER=[^ ]*`//' ...

Beachten Sie, dass quote-names muss sein TRUE (was standardmäßig der Fall ist).

Ich hoffe, dass in neueren Versionen der Schalter --skip-definer die in mysqlpump in Version 5.7 eingeführt wurde, kommt auch zu mysqldump.

0voto

Xdg Punkte 1585

Nichts funktionierte bei mir, also musste ich meine eigene Regex schreiben.

  1. Versuchen Sie, Ihre Datenbank in eine Datei zu dumpen, cat gesamte Datei und grep nur Ihre definierenden Aussagen zu sehen.

    cat file.sql | grep -o -E '.{,60}DEFINER.{,60}'

  2. Schreiben Sie Ihre Regex

  3. Fügen Sie Ihren Dump mit dieser Regex in sed ein. Zum Beispiel ist meine Anweisung:

    mysqldump | sed -E 's//*!500[0-9][0-9] DEFINER=.+?*///' | sed -E 's/DEFINER= ?[^ ]+? ?@ ?[^ ]+? ?//'

  4. Gewinn!

0voto

Luiz Rodolfo Punkte 1

Remove_definers.bat:

@echo off
(for /f "tokens=1,2*" %%a in (dumpfile.sql) do (
 if "%%b"=="" (echo %%a) else (
  echo %%b | find "DEFINER" > null && echo %%a %%c || echo %%a %%b %%c
 )
)) > dumpfile_nodefiners.sql

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