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-data
ferait 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)?
87
--no-data
omettra les valeurs auto_increment par défaut.Réponses:
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 leg
(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
\b
est 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
la source
--skip-auto-increment
soit 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?--skip-auto-increment
est 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 dused
filtrage!La réponse de JoDev a parfaitement fonctionné pour moi avec un petit ajustement de l'expression régulière sed:
la source
\b
fait dans la déclaration sed, mais selon la suggestion de @ JohnW ici, la suppression de ce commutateur fait également l'affaire pour moi.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
la source
drop table
s, jeux de caractères, etc.Grâce à ce post, j'ai pu répondre à ma question:
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:
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.la source
mysqldump -u [UTILISATEUR] -p [MOT DE PASSE] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]
la source
--skip-opt
discuté ici et ici.