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=[^ ]* / /''
Debería buscar la respuesta aquí: https://dba.stackexchange.com/questions/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079
La mejor forma en mi opinión para resolver este problema, es no agregar un análisis adicional de cadena con sed o grep o cualquier otro, en su lugar mysqldump puede generar un buen volcado agregando --single-transaction
Desde mysql versión 5.7.8 puede usar la opción --skip-definer
con mysqlpump, por ejemplo:
mysqlpump --skip-definer -h localhost -u user -p yourdatabase
Consulte el manual de mysql actualizado en http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-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.
Abra el archivo de volcado en un editor de texto y reemplace todas las apariciones de
DEFINER=root@localhost
con una cadena vacía ""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
Pipe la salida a través de
sed
:mysqldump ... | sed -e ''s/DEFINER[ ]*=[ ]*[^*]*/*//*/'' > triggers_backup.sql
No estoy seguro de si ayuda pero utilizo SQLyog Community Edition, disponible en: -
https://code.google.com/p/sqlyog/wiki/Downloads
Al eliminar sql o copiar en otra base de datos, le permite ''Ignorar DEFINER''
Es gratis y proporciona la funcionalidad básica que mucha gente necesita
También hay una versión paga disponible en:
https://www.webyog.com/product/sqlyog
Aclamaciones
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