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