Estoy tratando de crear una estructura simple solo volcado de mi base de datos. El uso mysqldump
me 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)
Respuestas:
¡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.
fuente
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):
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):
fuente
mysqldump ... | grep -v '^-- Dump completed on .*$'
DROP DATABASE IF EXISTS
quirófanoIGNORING 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.--skip-dump-date
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
--compact
sin--skip-comments
--skip-comments
elimina los comentarios relacionados con la versión y demás.fuente
SET NAMES
llamada 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-keys
para 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?character_set_client
no se puede configurar en 5.6 debido a un error o algo así, por lo que cuando está mysqldumping, por ejemploutf8mb4
, datos, obtiene estos comentarios condicionales donde no los desea.¿Has probado la opción de acceso directo
--compact
?Información aquí .
fuente
-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)
.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.
fuente
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.
fuente
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
fuente
Probablemente ejecutando una expresión regular en él para eliminar las líneas que contienen 40014 o 40111, etc.
fuente
Dado que está en Windows, si nadie encuentra una solución mejor, puede usar un script de Python en su lugar:
Uso desde la línea de comando:
Elimina todas las líneas como esta:
/*!....... */;
fuente
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
fuente
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
fuente
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 ...
fuente
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;)
fuente
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.
fuente