J'ai une base de données MySQL et j'essaie de trouver un moyen d'exporter uniquement sa structure, sans les valeurs d'auto-incrémentation. mysqldump --no-data
ferait presque l'affaire, mais il conserve les valeurs d'auto-incrémentation. Y a-t-il un moyen de le faire sans utiliser PHPMyAdmin (dont je sais qu'il peut le faire) ?
Réponses
Trop de publicités?Vous pouvez 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
pour qu'il fonctionne correctement, ajoutez le g
(para g remplacement lobal) 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.
En \b
est inutile et casse parfois la commande. Voir ce qui suit Sujet 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
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 des vues, des déclencheurs et des routines aussi,
mysqldump -hlocalhost -uuser -ppass \
--skip-opt --events --routines --no-data \
schemaname
Grâce à ce billet, j'ai pu répondre à ma question :
Comment puis-je faire un contrôle de version sur ma base de données ?
Puis j'ai juste créé 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"
Puis j'ai ajouté ceci à la crontab :
30 5 * * * sh /home/scripts/db_bkp.sh
Puis dans mon repo j'ai ajouté le résultat, db_structure.sql
à git et avant de pousser les changements à prod, je vérifie toujours s'il y a des changements structurels que j'ai oublié de faire sur tous les dbs.