Tengo un volcado de MySQL de una de mis bases de datos. En él, hay cláusulas DEFINER que se parecen a,
"DEFINER=`root`@`localhost`"
Es decir, estas cláusulas DEFINER están en mis declaraciones CREATE VIEW y CREATE PROCEDURE. ¿Hay alguna forma de eliminar estas cláusulas DEFINER de mi archivo de volcado?
Respuestas:
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
:Canalice la salida a través de
sed
:fuente
sed -E 's/DEFINER=
[^]+
@[^
] +/DEFINER=CURRENT_USER/g' dump.sql > new_dump.sql
Tiene la ventaja de mantener restricciones / control de acceso.sed
comando no elimina la cláusula DEFINER de los procedimientos y funciones. Aquí está la versión mejorada que maneja vistas, disparadores, procedimientos y funciones:sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*PROCEDURE/PROCEDURE/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*FUNCTION/FUNCTION/'
Puedes eliminar usando SED
En MacOS:
fuente
-i extension
"Edite archivos en el lugar, guardando copias de seguridad con la extensión especificada. Si se proporciona una extensión de longitud cero, no se guardará ninguna copia de seguridad. No se recomienda dar una extensión de longitud cero cuando archivos de edición in situ, ya que corre el riesgo de corrupción o contenido parcial en situaciones en las que se agota el espacio en disco, etc. "Desde la versión 5.7.8 de mysql puede usar la
--skip-definer
opción con mysqlpump, por ejemplo:Consulte el manual actualizado de mysql en http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer
fuente
mysqldump
ymysqlpump
- aquí está la pregunta relacionada: dba.stackexchange.com/questions/118846/mysqldump-vs-mysqlpumpinformation_schema.user
, y esto no siempre es legible para todos los usuariosUsé estas ideas para quitar la cláusula DEFINER de mi propia salida de mysqldump, pero tomé un enfoque más simple:
Solo quita el
!
antes del código y DEFINER, y el resto del comentario se convertirá en un comentario regular.Ejemplo:
se vuelve indefenso, tan poco como hacer esto ..
Sin embargo, la expresión regular más fácil es eliminar el! y los numeros
Eso elimina
!#### DEFINER
y reemplaza con DEFINER ... también puede eliminar DEFINER, realmente no importa, una vez que aparezca el "!" se ha idofuente
De acuerdo con las recomendaciones del otro, aquí hay un ejemplo de cómo eliminar el DEFINER del volcado, una vez finalizado el volcado:
fuente
user
@localhost
* / / *! 50003 trigger my_triggername ANTES DE INSERTAR EN my_table PARA CADA FILA .... * / ;; ygrep -v
eliminará esas líneas por completo. (aunque 50017! = 50013)Como otros mencionaron, eliminar el 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í:
fuente
*/
. MySQL 5.6.31.Para una solución automatizada, podría mirar
mysqlmigrate
. Es un envoltorio Bashmysqldump
que le permite migrar bases de datos e ignorar las declaraciones DEFINER. Ejemplo:http://thesimplesynthesis.com/post/mysqlmigrate (o GitHub )
De lo contrario, sí, se necesita un comando como el que señala Abhay:
fuente
Otra opción en OSX para eliminar definidores en el archivo:
fuente
Deberías buscar la respuesta aquí: /dba/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079
En mi opinión, la mejor manera de abordar 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
fuente
Una forma rápida de hacer esto es canalizar la salida de mysqldump a través de sed para eliminar las
DEFINER
declaraciones envueltas en comentarios condicionales. Utilizo esto para eliminarDEFINER
de lasCREATE TRIGGER
declaraciones, pero puede modificar el número de versión del comentario de la condición en la expresión regular para que se adapte a sus propósitos.fuente
No estoy seguro de si ayuda, pero uso SQLyog Community Edition, disponible en: -
https://code.google.com/p/sqlyog/wiki/Downloads
Al descargar sql o copiar a 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 de pago disponible en: -
https://www.webyog.com/product/sqlyog
Salud
fuente
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ónfuente
Aquí hay una solución de trabajo completa para eliminar la información DEFINER para
MySQL 5.6.x
Linux. (Probado enCentOS 6.5
).Por lo general, tenemos que reemplazar las siguientes entradas del volcado de Mysql (si se toman junto con los datos y los activadores / rutinas / funciones).
El volcado se realizó con el siguiente comando mysqldump.
El archivo de volcado requerido sin información de DEFINER se puede obtener con los siguientes tres comandos.
Si el archivo de volcado está en su carpeta actual, ignore [PATH /].
Si los datos en las tablas son muy grandes, realice el volcado en dos archivos, en un archivo de volcado tome el volcado con datos y en otro archivo de volcado tome el volcado solo de los scripts (Disparadores / Funciones / Procedimientos) y ejecute los tres anteriores comandos en el segundo archivo de volcado (scripts).
fuente
Reemplace 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í:
que realmente es solo llamar a ANT. Entonces no tendrás que preocuparte por eso.
fuente
En máquinas Linux, puede usar este resumen:
Solo tiene que reemplazar las cadenas en negrita con sus credenciales de usuario de base de datos 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/
fuente
La única forma en que podría hacerlo funcionar en Windows:
Instale http://gnuwin32.sourceforge.net/ para tener sed en la línea de comandos y agréguelo a la RUTA de Windows : D: \ programmes \ GetGnuWin32 \ bin;
fuente
Gracias a todos por las pistas. Siendo perezoso, escribí un script llamado: "MYsqldump":
fuente
Por algo como:
Prueba esto:
fuente
abra su base de datos con cualquier editor, usé con notepad ++,
encuentre todo, pruebe eso
DEFINER=root@localhost
y reemplácelo con nada (""
) IE. bórralo.Luego, puede importarlo a cualquier host que desee.
fuente
La expresión regular más simple que me funciona con todos los objetos es:
Tenga en cuenta que
quote-names
tiene que serTRUE
(que es de forma predeterminada).Espero que en las versiones más recientes el conmutador
--skip-definer
introducido en mysqlpump en la versión 5.7 también llegue a mysqldump.fuente
He usado 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-Codificación predeterminada $ file_out_full_path
fuente
Nada funcionaba para mí, así que necesitaba escribir mi propia expresión regular.
Intente volcar su base de datos en un archivo,
cat
un archivo completo ygrep
solo sus declaraciones definitorias para verlas.cat file.sql | grep -o -E '. {, 60} DEFINER. {, 60}'
Escribe tu expresión regular
Canalice su volcado a sed con esta expresión regular. Por ejemplo, la declaración mía es:
mysqldump | sed -E 's // *! 500 [0-9] [0-9] DEFINER =. +? * ///' | sed -E 's / DEFINER =
?[^ ]+?
? @?[^ ]+?
? //'¡Lucro!
fuente
remove_definers.bat:
fuente