mysqldump - Esporta solo la struttura senza autoincremento


88

Ho un database MySQL e sto cercando di trovare un modo per esportare solo la sua struttura, senza i valori di incremento automatico. mysqldump --no-datafarebbe quasi il lavoro, ma mantiene i valori auto_increment. C'è un modo per farlo senza usare PHPMyAdmin (che so che può farlo)?


Sembra che con MySQL 5.5 (server) --no-dataometta i valori auto_increment per impostazione predefinita.
Joey Adams

@JoeyAdams sei sicuro? Questo non è il comportamento che provo
aland

2
Il mysqldump di @JoeyAdams MySQL 5.7. * Non omette l'auto_increment quando si usa --no-data.
Tiberiu-Ionuț Stan il

Risposte:


70

Puoi farlo :

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

Come accennato da altri, se vuoi sedche funzioni correttamente, aggiungi il parametro g(for g lobal replacement) in questo modo:

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

(questo funziona solo se è stato installato tools grafici: mysqldump --skip-auto-increment)

Nuovo AGGIORNAMENTO grazie ai commenti.

Il \bè inutile e, talvolta, si romperà il comando. Vedere questo argomento SO per le spiegazioni. Quindi la risposta ottimizzata sarebbe:

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

11
Non credo --skip-auto-incrementsia una vera opzione. Non riesco a trovarlo nella documentazione . Nessuno dei due bug di MySQL per questo problema lo menziona: 20786 , 30957 . Quale versione di mysqldump ha questa opzione?
Rich

1
--skip-auto-incrementè un'opzione aggiunta in MySQL GUI Tools se un ricordo correttamente. (non sono sicuro ^^) Quindi in realtà non è proprio una soluzione! Ma il secondo comando inline è corretto, l'ho fondato qui dove l'argomento parla di problema di autoincremento e fornisce l'idea del sedfiltro!
JoDev

4
L'opzione Sed non rimuove tutti gli incrementi automatici se si esportano più tabelle, solo l'ultima. Inoltre, --skip-auto-increment non è un'opzione esistente. In che modo questa risposta è stata valutata così in alto?
Lex

3
hai bisogno di ag alla fine del tuo comando sed: sed 's /.../.../ g' per sostituire tutte le occorrenze.
p91paul

Questo comando non è corretto. --skip-auto-increment non esiste. La regex non è corretta. Come ha notato p91paul, il modificatore g deve essere aggiunto per sostituire tutte le occorrenze. Usa invece la soluzione @JohnW.
Aalex Gabi

52

La risposta di JoDev ha funzionato perfettamente per me con una piccola modifica all'espressione regolare sed:

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

1
Sì, non sono sicuro di cosa \bfaccia all'interno dell'istruzione sed, ma secondo il suggerimento di @ JohnW qui, la rimozione di quell'interruttore fa il trucco anche per me.
David

4

È --create-options, incluso con --opt, per impostazione predefinita, che genera le definizioni della tabella AUTO_INCREMENT.

Se vuoi solo i tavoli di 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

Se vuoi anche visualizzazioni, trigger e routine,

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

3
Nota che questo elimina anche qualsiasi campo di incremento automatico, drop tables, set di caratteri, ecc.
Deanna

2

Grazie a questo post, ho potuto rispondere alla mia domanda:

Come posso eseguire il controllo della versione sul mio db?

Quindi ho appena creato questo 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"

Quindi ho aggiunto questo a crontab:

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

Poi nel mio repository ho aggiunto il risultato, db_structure.sqla git e prima di spingere le modifiche a prod controllo sempre se ci sono cambiamenti strutturali che ho dimenticato di fare su tutti i db.


-1

mysqldump -u [USER] -p [PASSWORD] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]


6
Questo rimuoverà anche il flag auto_increment sui campi in cui è abilitato, non solo il valore auto_increment alla fine.
Aquarion

--skip-optdiscusso qui e qui.
Chris,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.