mysql

Eliminar la cláusula DEFINER de MySQL Dumps



mysqldump mariadb (20)

Tengo un volcado de MySQL de una de mis bases de datos. En él, hay cláusulas DEFINER que parecen,

"DEFINER=`root`@`localhost`"

A saber, estas cláusulas DEFINER están en mis instrucciones CREATE VIEW y CREATE PROCEDURE. ¿Hay alguna manera de eliminar estas cláusulas DEFINER de mi archivo de volcado?


Aquí hay una solución de trabajo completa para eliminar la información del DEFINER para MySQL 5.6.x Linux. (Probado en CentOS 6.5 ).

De manera habitual, debemos reemplazar las siguientes entradas del volcado Mysql (si se toman junto con datos y desencadenadores / rutinas / funciones).

/*!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`

El volcado fue tomado con el siguiente comando mysqldump.

mysqldump -uMYSQLUSER -pPASSWORD DATABASENAME -R > dbdump.sql

El archivo de volcado requerido sin información de DEFINER se puede obtener con los siguientes tres comandos.

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/`@/`%/`//"

Si el archivo de volcado está en su carpeta actual, entonces ignore [RUTA /].

Si los datos en tablas son muy grandes, tome el volcado en dos archivos, en un archivo de volcado, tome el volcado con datos y en otro archivo de volcado, tome el volcado de los scripts solamente (Disparadores / Funciones / Procedimientos) y ejecute los tres anteriores comandos en el segundo archivo de volcado (scripts).


Como otros mencionaron eliminar al definidor con cualquier tipo de expresión regular no es demasiado complejo. Pero los otros ejemplos me quitaron las definiciones de vista.

Esta es la expresión regular que funcionó para mí:

sed -e ''s/DEFINER=[^ ]* / /''




En máquinas Linux, puedes usar este one-liner:

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

Solo tiene que reemplazar cadenas en negrita con sus credenciales de usuario de BD y el nombre de la base de datos / patrón similar.

Más información aquí: http://blog.novoj.net/2014/05/16/recreate-mysql-views-without-definer-one-liner-solution-linux/


Gracias a todos por los consejos. Siendo perezoso, escribí un guión llamado: "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


He utilizado el script de PowerShell para eliminar todas las líneas con DEFINER :

get-content $ file_in_full_path | select-string -pattern $ line_string_delete -notmatch | Out-File -width 1000000000 -Encoding Default $ file_out_full_path


La única forma en que podría hacerlo funcionar bajo Windows:

Instale http://gnuwin32.sourceforge.net/ para sed en la línea de comando y agréguela a la RUTA de Windows : 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


La expresión regular más simple que funciona para mí con todos los objetos es:

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

Tenga en cuenta que quote-names tienen que ser TRUE (que es por defecto).

Espero que en las versiones más nuevas, el conmutador --skip-definer introducido en mysqlpump en la versión 5.7 también llegue a mysqldump.


No creo que haya una manera de ignorar la adición de DEFINER s al volcado. Pero hay formas de eliminarlos después de crear el archivo de volcado.

  1. Abra el archivo de volcado en un editor de texto y reemplace todas las apariciones de DEFINER=root@localhost con una cadena vacía ""

  2. Edite el volcado (o canalice la salida) usando perl :

    perl -p -i.bak -e "s/DEFINER=/`/w.*/`@/`/d[0-3].*[0-3]/`//g" mydatabase.sql

  3. Pipe la salida a través de sed :

    mysqldump ... | sed -e ''s/DEFINER[ ]*=[ ]*[^*]*/*//*/'' > triggers_backup.sql



Otra opción en OSX para eliminar definidores en el archivo:

sed -i '''' ''s/DEFINER=`[^`][^`]*`@`[^`][^`]*`//g'' file.sql


Para algo como:

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

Prueba esto:

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


Para mí, esto funciona: perl -p -i.bak -e "s/DEFINER=[^ |/s]*//g" yourdump.dmp . Esto eliminó DEFINER = root @ localhost de mi volcado, en cada declaración de procedimiento de creación


Para una solución automatizada, puede consultar mysqlmigrate . Es un contenedor Bash alrededor de mysqldump que te permite migrar bases de datos e ignorar las sentencias DEFINER. Ejemplo:

$ mysqlmigrate -u root -p pass --ignore-definer from_db to_db

http://thesimplesynthesis.com/post/mysqlmigrate (o GitHub )

De lo contrario, sí, se necesita un comando como el que señala Abhay:

$ mysqldump -u root -ppass the_db | sed -e ''s/DEFINER[ ]*=[ ]*[^*]*/*//*/'' > the_db.sql


Puedes eliminar usando SED

sed -i ''s/DEFINER=[^*]*/*//*/g'' mydump.sql

En MacOS:

sed -i '''' ''s/DEFINER=[^*]*/*//*/g'' mydump.sql


Reemplace a todos sus usuarios definidores con CURRENT_USER. En mi script de Gradle que crea la copia de seguridad, mi script de reemplazo se ve así:

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

que realmente solo llama a ANT. Entonces no tendrás que preocuparte por eso.


Según las recomendaciones de los otros, aquí hay un ejemplo de cómo eliminar el DEFINER del volcado, después de que el volcado haya finalizado:

mysqldump -u user --password=''password'' -h localhost database | grep -v "50013 DEFINER" > dump.sql


Una forma rápida de hacerlo es mysqldump la salida de mysqldump través de sed para eliminar las sentencias DEFINER envueltas en comentarios condicionales. Lo uso para eliminar DEFINER de las CREATE TRIGGER , pero puede modificar el número de versión de comentario de condición en la expresión regular para que se ajuste a sus propósitos.

mysqldump -u user --password=''password'' -h localhost database | / sed ''s////*!50017 DEFINER=`.*`@`.*`/*////''


Usé estas ideas para quitar la cláusula DEFINER de mi propia salida mysqldump, pero adopté un enfoque más simple:

Solo elimina el ! antes del código y DEFINER, y el resto del comentario se convierte en un comentario regular.

Ejemplo:

/*!50017 DEFINER=`user`@`111.22.33.44`*/

se vuelve impotente, tan poco como hacer esto ...

/* 50017 DEFINER=`user`@`111.22.33.44`*/

La expresión regular más fácil, sin embargo, es eliminar el! y los números

mysqldump | /usr/bin/perl -pe ''s//!/d+ DEFINER/DEFINER/'' > dumpfile.sql

¡Eso elimina !#### DEFINER y reemplaza con DEFINER ... también puedes eliminar DEFINER, realmente no importa - ¡una vez que el "!" se ha ido