mysqldump - Exporter la structure uniquement sans auto-incrémentation

87

J'ai une base de données MySQL et j'essaie de trouver un moyen d'exporter uniquement sa structure, sans les valeurs d'incrémentation automatique. mysqldump --no-dataferait presque le travail, mais il conserve les valeurs auto_increment. Existe-t-il un moyen de le faire sans utiliser PHPMyAdmin (que je sais qu'il peut le faire)?

Paris
la source
Cela ressemble à MySQL 5.5 (serveur), --no-dataomettra les valeurs auto_increment par défaut.
Joey Adams
@JoeyAdams êtes-vous sûr? Ce n'est pas le comportement que j'éprouve
aland
2
Le mysqldump de @JoeyAdams MySQL 5.7. * Ne supprime pas l'auto_increment lors de l'utilisation de --no-data.
Tiberiu-Ionuț Stan

Réponses:

68

Tu peux le faire :

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

Comme mentionné par d' autres, si vous voulez sedà fonctionne correctement, ajoutez le g(pour g paramètre de remplacement MONDIALES) comme ceci:

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

(cela ne fonctionne que si vous avez installé GUI Tools: mysqldump --skip-auto-increment)

Nouvelle MISE À JOUR grâce aux commentaires.

Le \best inutile et cassera parfois la commande. Voir cette rubrique SO pour des explications. La réponse optimisée serait donc:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql
JoDev
la source
11
Je ne pense pas que ce --skip-auto-incrementsoit une vraie option. Je ne le trouve pas dans la documentation . Aucun des deux bogues MySQL pour ce problème ne le mentionne: 20786 , 30957 . Quelle version de mysqldump a cette option?
Rich
1
--skip-auto-incrementest une option ajoutée dans MySQL GUI Tools si vous vous en souvenez correctement. (pas sûr ^^) Donc en fait ce n'est pas vraiment une solution! Mais la deuxième commande en ligne est correcte, je l'ai fondée ici où le sujet parle du problème d' auto-incrémentation , et donne l'idée du sedfiltrage!
JoDev
4
L'option Sed ne supprimera pas tous les incréments automatiques si vous exportez plusieurs tables, uniquement la dernière. De plus, --skip-auto-increment n'est pas une option existante. Comment cette réponse a-t-elle été si élevée?
Lex
3
vous avez besoin de ag à la fin de votre commande sed: sed 's /.../.../ g' pour remplacer toutes les occurrences.
p91paul
Cette commande n'est pas correcte. --skip-auto-increment n'existe pas. Le regex n'est pas correct. Comme p91paul l'a noté, le modificateur g doit être ajouté afin de remplacer toutes les occurrences. Utilisez plutôt la solution @JohnW.
Aalex Gabi
52

La réponse de JoDev a parfaitement fonctionné pour moi avec un petit ajustement de l'expression régulière sed:

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql
JohnW
la source
1
Oui, je ne suis pas sûr de ce que cela \bfait dans la déclaration sed, mais selon la suggestion de @ JohnW ici, la suppression de ce commutateur fait également l'affaire pour moi.
David
4

C'est --create-options, qui est inclus avec --opt, par défaut, qui génère les définitions de table AUTO_INCREMENT.

Si vous ne voulez que les tables de 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 vous voulez aussi des vues, des déclencheurs et des routines,

mysqldump -hlocalhost -uuser -ppass \
    --skip-opt --events --routines --no-data \
    schemaname
Erin Schoonover
la source
3
Notez que cela supprime également tous les champs d'incrémentation automatique, drop tables, jeux de caractères, etc.
Deanna
2

Grâce à ce post, j'ai pu répondre à ma question:

Comment puis-je faire le contrôle de version sur ma base de données?

Ensuite, je viens de créer ce 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"

Ensuite, j'ai ajouté ceci à crontab:

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

Ensuite, dans mon repo, j'ai ajouté le résultat db_structure.sqlà git et avant de pousser les modifications vers prod, je vérifie toujours s'il y a des changements structurels que j'ai oublié de faire sur tous les dbs.

Gerardo Rosciano
la source
-1

mysqldump -u [UTILISATEUR] -p [MOT DE PASSE] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]

Zio Panzu
la source
6
Cela supprimera également l'indicateur auto_increment sur les champs sur lesquels il est activé, pas seulement la valeur auto_increment à la fin.
Aquarion
--skip-optdiscuté ici et ici.
Chris