¿Cómo puedo deshacerme de estos comentarios en un volcado de MySQL?

82

Estoy tratando de crear una estructura simple solo volcado de mi base de datos. El uso mysqldumpme da un resultado como:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

DROP TABLE IF EXISTS `foo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;

No importa lo que intente, parece que no puedo deshacerme de esos comentarios.

Actualmente estoy usando: mysqldump -p -d --add-drop-table --skip-tz-utc --skip-set-charset -h 127.0.0.1 -u foo bar --result-file=dumpfile.sql

Editar: Sin embargo, deseo retener otros comentarios, como-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)

etheros
fuente
No es una respuesta directa, pero he abandonado mysqldump por completo por mk-parallel-dump ; es más rápido (genera múltiples procesos) y, dependiendo de lo que vaya a hacer con la salida de volcado, más flexible ya que encapsula efectivamente mysqldump y 'select en la sintaxis de outfile 'juntos.
zznate
2
Me pregunto por qué Oracle no agregó opciones tan importantes a mysqdump.
PHPst

Respuestas:

162

¡Whoa! Estos no son realmente comentarios aunque se vean así. Son tokens de ejecución condicional.

Toma esta línea:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

Si la versión de mySQL es 4.00.14 o superior , el servidor MySQL ejecutará esta declaración.

Esta sintaxis de comentario mágico está documentada en la sección Sintaxis de comentario del manual.

Probablemente no quieras deshacerte de estas cosas.

O. Jones
fuente
2
Otra pregunta que pregunta específicamente sobre los comentarios en MySQL que se tratan como SQL ejecutable (recién publicado por mí): stackoverflow.com/questions/25614919/…
Dan Nissenbaum
1
Hay algunos casos en los que eliminar comentarios puede ayudar. es decir, bugs.mysql.com/bug.php?id=48972 cuando --insert-ignore no funciona como se esperaba debido a ellos
varela
+1 Nunca supe eso. Pensé que eran solo comandos que mysql dump estaba ejecutando mientras se exportaba. Respuesta muy esclarecedora.
Capitán Hipertexto
1
Supongamos que eso debería significar que debería haber opciones de compatibilidad esperadas, que especifiquen si espera ejecutar el sql en versiones anteriores de mysql y, de no ser así, debe incluirlo en un comentario condicional.
CMCDragonkai
40

Sé que esta es una pregunta antigua, pero al menos aquí hay una respuesta. Tampoco pude encontrar una bandera en mysqldump para eliminar los comentarios condicionales, o de hecho, una mejor opción para establecer una versión mínima de mysql para que aparezcan estos comentarios. Si solo desea destruirlos a todos, puede hacerlo usando grep o sed (sed deja líneas en blanco, grep no):

mysqldump ... | grep -v '^\/\*![0-9]\{5\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-9]\{5\}.*\/;$//g'

Para responder a mi propio deseo de eliminar condicionalmente los comentarios que dependen de la versión de mysql, use uno de estos (elimina cualquier comentario para cualquier cosa <mysql5):

mysqldump ... | grep -v '^\/\*![0-4][0-9]\{4\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-4][0-9]\{4\}.*\/;$//g'
Tom Hennigan
fuente
1
Para las copias de seguridad de rsnapshot, es útil deshacerse de la última línea, por lo que una base de datos que no cambió da como resultado el mismo archivo:mysqldump ... | grep -v '^-- Dump completed on .*$'
rubo77
sí, pero el problema es que puede perder el DROP DATABASE IF EXISTS quirófano IGNORING YOUR CURRENT SESSION VARIABLES . A menos que sepa lo que está haciendo: No los elimine, ESPECIALMENTE CUANDO MIGRA ENTRE AMBIENTES / ANFITRIONES. ya que la salida resultante puede no ser la esperada, por varias razones. Fueron puestos allí para su protección. pero si no quiere ponerse el cinturón de seguridad, es su elección.
JayRizzo
1
@ rubo77 También podría usar este parámetro de volcado de mysql:--skip-dump-date
dehart
33

Intenta --skip-comments?

Gracias

Editar:

Ya veo ... prueba esto

--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

Juegue para eliminar algunas de las opciones hasta que obtenga el resultado deseado, básicamente esto es lo mismo que --compactsin--skip-comments

--skip-comments elimina los comentarios relacionados con la versión y demás.

Mahesh Velaga
fuente
5
Desafortunadamente, esto elimina todos los comentarios que quiero, dejando intactos todos los que no.
etheros
@etheros Estoy de acuerdo, pero deberíamos dar más detalles. Mi caso de uso se relaciona con datos estructurales controlados en origen. No quiero charlas no esenciales para cada mesa. Me gusta la SET NAMESllamada que --skip-set-charset, como se sugiere en esta respuesta, elimina; ocurre solo una vez al comienzo del archivo de volcado y podría afectar la restauración de datos de manera sustancial. Me gusta --skip-add-locks --skip-disable-keyspara mi caso de uso. Pero algunos de los comentarios condicionales, como /*!40101 SET character_set_client = @saved_cs_client */;y /*!40101 SET character_set_client = utf8 */... ¿útiles o no?
Ben Johnson
1
@BenJohnson No, no lo son. character_set_clientno se puede configurar en 5.6 debido a un error o algo así, por lo que cuando está mysqldumping, por ejemplo utf8mb4, datos, obtiene estos comentarios condicionales donde no los desea.
Slava
18

¿Has probado la opción de acceso directo --compact?

Información aquí .

Corey Ballou
fuente
2
Lo hice, sin embargo, deshabilita otros comentarios que quiero, como -- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32).
etheros
12

Técnicamente, las líneas de las que intenta deshacerse no son comentarios. Modifican temporalmente algunas variables al principio y luego las restablecen al valor anterior al final.

No son muy útiles (pero también inofensivos) en su caso, ya que está usando --no-data, pero pensé que valía la pena mencionar que las líneas tienen un propósito y no son solo comentarios.

Ike Walker
fuente
4

Esos no son comentarios, la ejecución de esa parte de los scripts depende de la versión de su mysql.

Puede eliminar "la parte del comentario", como

/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */

a

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

haciendo que el guión sea más "cómodo" para la lectura.

Si intenta ejecutar un script "cómodo" en una versión más reciente que la especificada en el "comentario", obtendrá un error.

Gustavo
fuente
2
¿Cómo podemos "eliminar la parte del comentario"? ¿Existe una opción de volcado para esto? No quiero revisar un par de archivos de conciertos a mano.
mpen
En realidad debería serlo: si intenta ejecutar un script "cómodo" en una versión anterior a la especificada en el "comentario", obtendrá un error.
Daniel
1

Es muy importante mantener los comentarios de ejecución condicional. Pero si sabe absolutamente que la versión de MySQL que cargará el volcado es mayor o igual a la que lo crea, puede eliminar la parte de "comentario" con esto:

sed -r  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g

Convertirá líneas como

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

a

SET SQL_MODE=@OLD_SQL_MODE ;

Porque esta línea debe ejecutarse en cualquier MySQL> = 4.1.1

Tenga en cuenta que esto no eliminará los comentarios de ejecución condicional de varias líneas, como cuando se descarga un disparador.

Dado que es imposible predecir el futuro, es mejor almacenar el volcado con los comentarios activados y solo eliminarlos cuando desee visualizarlo.

mysqldump ... > dump.sql
cat dump.sql | sed -E  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g > dump.no-comments.sql
Daniel
fuente
0

Probablemente ejecutando una expresión regular en él para eliminar las líneas que contienen 40014 o 40111, etc.

MindStalker
fuente
0

Dado que está en Windows, si nadie encuentra una solución mejor, puede usar un script de Python en su lugar:

import re, sys
sql = sys.stdin.read()
regex = re.compile(r'/\*![^\n]* \*/;\n', re.M)
print regex.sub('', sql)

Uso desde la línea de comando:

python program.py < your.sql > output.sql

Elimina todas las líneas como esta:

/*!....... */;
Mark Byers
fuente
0

Si ha tropezado con esta respuesta al intentar incluir su archivo structure.sql en git / github, puede eliminar el incremento automático con el siguiente código justo después de rastrillar db: structure: dump

# Remove beginning auto increments to prevent merge conflicts
filename = 'db/structure.sql'
File.atomic_write(filename) do |output|
  File.open(filename, 'rb').each do |input|
    output.write(input.gsub(/\s+AUTO_INCREMENT=\d+\s+/, ' '))
  end
end
jwg2s
fuente
1
¿Qué pasa con todos los votos negativos en las respuestas de "eliminar las líneas con una expresión regular"? Estos son totalmente válidos. Éste en particular es completamente aplicable a mi situación. +1 para todos ustedes.
plainjimbo
0

Hice este script para normalizar el volcado, incluida la eliminación de comentarios condicionales: https://github.com/luissquall/dbdump .

Sólo tienes que:

npm install -g @luissquall/dbdump

# Redirect output to a file
dbdump -u user -p -d database > struct.sql
luissquall
fuente
0

Utilizar --dump-date=FALSE

Hace exactamente lo que pide OP. (no exactamente, ya veo)

Fuente: resumen de opciones de mysqldump

Editar: Justo después de un minuto me di cuenta, esto es lo que estaba buscando, no el OP, sino salir de aquí ... con la esperanza de que alguien pueda usarlo: Esta línea de fecha que arruina el control de fuente, porque siempre es un cambio ...

g.pickardou
fuente
1
Exactamente lo que estaba buscando, ¿por qué la gente incluso rechaza esto? Gran voto a favor de mi parte.
kungfooman
-1

No sé si es lo que estás buscando, simplemente quería deshacerme de todos los comentarios de mysql para poder usar un resaltador de sintaxis, usé una expresión regular simple y reemplacé todo por el siguiente "/ \ *! [ 0-9] {5} | \ * / "y ¡listo! bonitos colores en el código;)

ITomas
fuente
-1

Como @Ollie y algunos otros señalaron, estos son tokens de ejecución condicional escritos en estilo comentario pero que tienen un propósito. Sin ellos, puede tener problemas al volver a crear tablas con restricciones de clave externa fuertemente impuestas. Por ejemplo, la tabla A tiene FK para la tabla B y, por lo tanto, la tabla A no se puede crear hasta que la tabla B lo haga y así sucesivamente. Sin deshabilitar las comprobaciones clave, es posible que nunca pueda volver a crearlas dependiendo de cómo se multa el orden de su mesa.

Devy
fuente