web-dev-qa-db-fra.com

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

J'ai une base de données MySQL et j'essaie de trouver un moyen d'exporter sa structure uniquement, sans les valeurs d'incrémentation automatique. mysqldump --no-data ferait presque l'affaire, mais il conservera les valeurs auto_increment. Est-il possible de le faire sans utiliser PHPMyAdmin (pour que je sache qu'il peut le faire)?

68
Paris

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 que sed fonctionne correctement, ajoutez le paramètre g (pour g lobal replacement), comme suit: 

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é des outils graphiques: mysqldump --skip-auto-increment)

55
JoDev

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

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

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

Si vous voulez seulement 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
4
Ian Schoonover

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

Comment puis-je contrôler la version de 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"

Puis j'ai ajouté ceci à crontab:

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

Puis, dans mon référentiel, j'ai ajouté le résultat, db_structure.sql à git et avant de mettre les modifications à la production, je vérifie toujours s'il y a des modifications structurelles que j'ai oubliées de faire sur toutes les bases.

2
Gerardo Rosciano

Juste pour utiliser --add-drop-table comme ceci:

mysqldump --no-data --add-drop-table

voir mysql bugs et mysql dev

0
Yoshio Mori