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?

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/

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

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

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