2013-03-27 10 views
59

Ich habe eine MySQL-Datenbank und ich versuche, eine Möglichkeit zu finden, seine Struktur nur zu exportieren, ohne die Auto-Inkrement-Werte. mysqldump --no-data würde fast den Job machen, aber es behält die auto_increment Werte. Gibt es eine Möglichkeit, dies zu tun, ohne PHPMyAdmin zu benutzen (von dem ich weiß, dass es das kann)?mysqldump - Struktur exportieren nur ohne Autoinkrement

+0

Mit MySQL 5.5 (Server) sieht '--no-data' standardmäßig auto_increment-Werte aus. –

+0

@JoeyAdams bist du sicher? Das ist nicht das Verhalten, das ich erfahre – aland

+2

@JoeyAdams MySQL 5.7. * S mysqldump nicht das auto_increment weglassen, wenn --no-data. –

Antwort

49

Sie können dies tun:

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

Wie bereits von anderen erwähnt, Wenn Sie sed zu Werke richtig wollen, fügen Sie die g (für g lobaler Ersatz) Parameter wie folgt aus:

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

(dies funktioniert nur, wenn Sie GUI Tools installiert haben: mysqldump --skip-auto-increment)

+0

Der letzte hat super funktioniert. Vielen Dank. – Paris

+10

Ich glaube nicht, dass 'skip-auto-increment' eine echte Option ist. Ich finde es nicht in der [Dokumentation] (http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html). Keiner der beiden MySQL Bugs für dieses Problem erwähnt es: [20786] (http://bugs.mysql.com/bug.php?id=20786), [30957] (http://bugs.mysql.com/bug .php? id = 30957). Welche Version von mysqldump hat diese Option? – Rich

+1

'--skip-auto-increment' ist eine Option, die in MySQL GUI Tools hinzugefügt wird, wenn man sich richtig erinnert. (nicht sicher ^^) Also in der Tat ist es nicht wirklich eine Lösung! Aber der zweite Inline-Befehl ist korrekt, ich habe ihn [hier] (http: //bugs.mysql.com/bug.php? id = 20786) wo das Thema über ** autoincrement ** Problem zu sprechen, und bieten die Idee der 'sed' Filterung! – JoDev

-1

mysq ldump -u [USER] -p [KENNWORT] -d --skip-opt --eine-transaktion [DB_SCHEMA]> [FILE.ESTENSIONE]

+6

Dadurch wird auch das Flag auto_increment für die Felder entfernt, für die es aktiviert ist, nicht nur der Wert auto_increment am Ende. – Aquarion

+0

'--skip-opt' diskutiert [hier] (http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html#option_mysqldump_opt) und [hier.] (Http: //bugs.mysql .com/bug.php? id = 22941) – Chris

3

Es ist --create-options, die im Lieferumfang enthalten ist - opt, das standardmäßig die AUTO_INCREMENT-Tabellendefinitionen generiert.

Wenn Sie nur die Basistabellen wollen,

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 

Wenn Sie Ansichten möchten, auch Trigger und Routinen,

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

Beachten Sie, dass damit auch alle Autoinkrementfelder, 'drop tables', Zeichensätze usw. gelöscht werden. – Deanna

32

JoDev Antwort perfekt für mich mit einer kleinen Anpassung an die regelmäßige arbeitete sed Ausdruck:

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

Dank diesem Beitrag konnte ich meine Frage beantworten:

Wie kann ich Versionskontrolle auf meinem db?

Dann einfach dieses Skript, das ich erstellt: 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" 

Dann ist dieses ich hinzugefügt crontab: das Ergebnis, db_structure.sql git und vor

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

Da ist in meinem Repo Ich habe drängen Änderungen an prod Ich überprüfe immer, ob es strukturelle Änderungen gibt, die ich auf allen dbs vergessen habe.

Verwandte Themen