mysqldump - Struktur nur ohne automatische Inkrementierung exportieren

87

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

Paris
quelle
Es sieht so aus, als würde bei MySQL 5.5 (Server) --no-datastandardmäßig die Werte für die automatische Inkrementierung weggelassen.
Joey Adams
@ JoeyAdams bist du sicher? Das ist nicht das Verhalten , das ich Erfahrung
Aland
2
@JoeyAdams MySQL 5.7. * Mysqldump lässt das auto_increment bei Verwendung von --no-data nicht aus.
Tiberiu-Ionuț Stan

Antworten:

67

Du kannst das :

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 sedrichtig funktioniert, fügen Sie den 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)

Neues UPDATE dank Kommentaren.

Das \bist nutzlos und bricht manchmal den Befehl. Erläuterungen finden Sie in diesem SO-Thema . Die optimierte Antwort wäre also:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql
JoDev
quelle
11
Ich denke nicht, dass dies --skip-auto-incrementeine echte Option ist. Ich kann es nicht in der Dokumentation finden . Keiner der beiden MySQL-Fehler für dieses Problem erwähnt es: 20786 , 30957 . Welche Version von mysqldump hat diese Option?
Rich
1
--skip-auto-incrementist eine Option, die in den MySQL GUI Tools hinzugefügt wurde, wenn Sie sich richtig erinnern. (nicht sicher ^^) Tatsächlich ist es also keine wirkliche Lösung! Aber der zweite Inline-Befehl ist korrekt. Ich habe ihn hier gegründet, wo das Thema Autoincrement- Problem behandelt wird, und die Idee des sedFilterns bereitgestellt!
JoDev
4
Die Option Sed würde nicht alle automatischen Inkremente entfernen, wenn Sie mehrere Tabellen exportieren, nur die letzte. Außerdem ist --skip-auto-increment keine vorhandene Option. Wie wurde diese Antwort so hoch bewertet?
Lex
3
Sie benötigen ag am Ende Ihres sed-Befehls: sed 's /.../.../ g', um alle Vorkommen zu ersetzen.
p91paul
Dieser Befehl ist nicht korrekt. --skip-auto-increment existiert nicht. Die Regex ist nicht korrekt. Wie p91paul feststellte, muss der Modifikator g hinzugefügt werden, um alle Vorkommen zu ersetzen. Verwenden Sie stattdessen die @ JohnW-Lösung.
Aalex Gabi
51

JoDevs Antwort funktionierte perfekt für mich mit einer kleinen Anpassung des sed regulären Ausdrucks:

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql
JohnW
quelle
1
Ja, ich bin mir nicht sicher, was das \bin der sed-Anweisung bewirkt, aber gemäß dem Vorschlag von @ JohnW hier ist das Entfernen dieses Schalters auch für mich der Trick.
David
4

Es sind standardmäßig --create-options, die in --opt enthalten sind, die die Tabellendefinitionen AUTO_INCREMENT generieren.

Wenn Sie nur die Basistabellen möchten,

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 auch Ansichten, Trigger und Routinen wünschen,

mysqldump -hlocalhost -uuser -ppass \
    --skip-opt --events --routines --no-data \
    schemaname
Erin Schoonover
quelle
3
Beachten Sie, dass dadurch auch alle Felder, drop tableZeichen, Zeichensätze usw. für die automatische Inkrementierung
Deanna
2

Dank dieses Beitrags konnte ich meine Frage beantworten:

Wie kann ich die Versionskontrolle auf meiner Datenbank durchführen?

Dann habe ich gerade dieses Skript 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 habe ich dies zu crontab hinzugefügt:

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

Dann habe ich in meinem Repo das Ergebnis db_structure.sqlzu git hinzugefügt und bevor ich Änderungen an prod vorgenommen habe, überprüfe ich immer, ob es strukturelle Änderungen gibt, die ich bei allen dbs vergessen habe.

Gerardo Rosciano
quelle
-1

mysqldump -u [USER] -p [PASSWORD] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]

Zio Panzu
quelle
6
Dadurch wird auch das Flag auto_increment in den Feldern entfernt, in denen es aktiviert ist, und nicht nur der Wert auto_increment am Ende.
Aquarion
--skip-opthier und hier
Chris