mysqldump - Exportar estructura solo sin autoincremento


87

Tengo una base de datos MySQL y estoy tratando de encontrar una manera de exportar solo su estructura, sin los valores de incremento automático. mysqldump --no-datacasi haría el trabajo, pero mantiene los valores de auto_increment. ¿Hay alguna forma de hacerlo sin usar PHPMyAdmin (que sé que puede hacerlo)?


Parece que con MySQL 5.5 (servidor) --no-dataomitirá los valores de auto_increment por defecto.
Joey Adams

@JoeyAdams, ¿estás seguro? Ese no es el comportamiento que experimento
aland

2
Mysqldump de @JoeyAdams MySQL 5.7. * No omite el auto_increment cuando se usa --no-data.
Tiberiu-Ionuț Stan

Respuestas:


68

Puedes hacerlo :

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//' > <filename>.sql

Como han mencionado otros, si usted quiere sedque funcione correctamente, añadir el g(para g parámetro de sustitución lobal) así:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > <filename>.sql

(esto sólo funciona si dispone de herramientas de interfaz gráfica de usuario: mysqldump --skip-auto-increment)

Nueva ACTUALIZACIÓN gracias a los comentarios.

El \bes inútil ya veces se romperá el comando. Consulte este tema de SO para obtener explicaciones. Entonces la respuesta optimizada sería:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql

11
No creo que --skip-auto-incrementsea ​​una opción real. No lo encuentro en la documentación . Ninguno de los dos errores de MySQL para este problema lo menciona: 20786 , 30957 . ¿Qué versión de mysqldump tiene esta opción?
Rich

1
--skip-auto-incrementes una opción agregada en MySQL GUI Tools si se recuerda correctamente. (no estoy seguro ^^) ¡Así que de hecho no es una solución! Pero el segundo comando en línea es correcto, lo encontré aquí, donde el tema habla sobre el problema del autoincremento y proporciona la idea de sedfiltrado.
JoDev

4
La opción Sed no eliminaría todos los incrementos automáticos si exporta varias tablas, solo la última. Además, --skip-auto-increment no es una opción existente. ¿Cómo llegó esta respuesta a tener una calificación tan alta?
Lex

3
necesita ag al final de su comando sed: sed 's /.../.../ g' para reemplazar todas las apariciones.
p91paul

Este comando no es correcto. --skip-auto-increment no existe. La expresión regular no es correcta. Como señaló p91paul, es necesario agregar el modificador g para reemplazar todas las apariciones. Utilice la solución @JohnW en su lugar.
Aalex Gabi

52

La respuesta de JoDev funcionó perfectamente para mí con un pequeño ajuste a la expresión regular sed:

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql

1
Sí, no estoy seguro de qué \bhace eso dentro de la declaración sed, pero según la sugerencia de @ JohnW aquí, la eliminación de ese interruptor también funciona para mí.
David

4

Es --create-options, que se incluye con --opt, de forma predeterminada, lo que genera las definiciones de la tabla AUTO_INCREMENT.

Si solo quiere las tablas base,

mysql -hlocalhost -uuser -ppass --skip-column-names --batch \
    -e "select table_name from tables where table_type = 'BASE TABLE' and table_schema = 'schemaname'" INFORMATION_SCHEMA \
| xargs mysqldump -hlocalhost -uuser -ppass \
    --no-data --skip-triggers --skip-opt --no-create-db \
    schemaname

Si también desea vistas, activadores y rutinas,

mysqldump -hlocalhost -uuser -ppass \
    --skip-opt --events --routines --no-data \
    schemaname

3
Tenga en cuenta que esto también elimina cualquier campo de incremento automático, drop tables, conjuntos de caracteres, etc.
Deanna

2

Gracias a esta publicación, pude responder mi pregunta:

¿Cómo puedo controlar las versiones en mi base de datos?

Entonces acabo de crear este script: db_bkp.sh

#!/bin/sh
filename="db_structure.sql"
backupfolder="/var/www/"
fpath="$backupfolder/$filename"
usr="DBUSER"
pass="DBPASS"
db="DBNAME"
mysqldump --user=$usr --password=$pass --no-data $db | sed 's/ AUTO_INCREMENT=[0-9]*//g' > "$fpath"

Luego agregué esto a crontab:

30 5 * * * sh /home/scripts/db_bkp.sh

Luego, en mi repositorio agregué el resultado, db_structure.sqla git y antes de presionar cambios a prod, siempre verifico si hay algún cambio estructural que olvidé hacer en todas las bases de datos.


-1

mysqldump -u [USUARIO] -p [CONTRASEÑA] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]


6
Esto también eliminará el indicador auto_increment en los campos en los que está habilitado, no solo el valor auto_increment al final.
Aquarion

--skip-optdiscutido aquí y aquí.
Chris
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.