mysqldump - Eksportuj tylko strukturę bez autoinkrementacji

88

Mam bazę danych MySQL i próbuję znaleźć sposób na wyeksportowanie tylko jej struktury, bez wartości autoinkrementacji. mysqldump --no-dataprawie wykona zadanie, ale zachowa wartości auto_increment. Czy jest jakiś sposób na zrobienie tego bez użycia PHPMyAdmin (wiem, że może to zrobić)?

Paryż
źródło
Wygląda na to, że w MySQL 5.5 (serwer) --no-datadomyślnie pominie wartości auto_increment.
Joey Adams
@JoeyAdams czy na pewno? To nie jest zachowanie, którego doświadczam
aland
2
@JoeyAdams MySQL 5.7. * Mysqldump nie pomija auto_increment podczas używania --no-data.
Tiberiu-Ionuț Stan,

Odpowiedzi:

70

Możesz to zrobić :

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

Jak wspomniano przez innych, jeśli chcesz sed, aby działa poprawnie, należy dodać g(na g skroniowe zastępczej) parametru takiego:

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

(ta działa tylko wtedy, gdy zainstalowany GUI Tools: mysqldump --skip-auto-increment)

Nowa AKTUALIZACJA dzięki komentarzom.

\bJest bezużyteczny, a czasem złamie polecenie. Zobacz ten temat SO, aby uzyskać wyjaśnienia. Tak więc zoptymalizowana odpowiedź brzmiałaby:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql
JoDev
źródło
11
Myślę, że nie --skip-auto-incrementjest to prawdziwa opcja. Nie mogę znaleźć tego w dokumentacji . Żaden z dwóch błędów MySQL dotyczących tego wydania nie wspomina o tym: 20786 , 30957 . Która wersja mysqldump ma tę opcję?
Rich
1
--skip-auto-incrementjest opcją dodaną w MySQL GUI Tools, jeśli dobrze pamiętasz. (nie jestem pewien ^^) Więc tak naprawdę to nie jest rozwiązanie! Ale drugie polecenie inline jest poprawne, założyłem je tutaj, gdzie temat mówi o problemie autoinkrementacji i podaję ideę sedfiltrowania!
JoDev
4
Opcja Sed nie usunie wszystkich automatycznych inkrementacji, jeśli eksportujesz wiele tabel, tylko ostatnią. Ponadto opcja --skip-auto-Increment nie istnieje. W jaki sposób ta odpowiedź została oceniona tak wysoko?
Lex
3
potrzebujesz ag na końcu polecenia sed: sed 's /.../.../ g', aby zastąpić wszystkie wystąpienia.
p91paul
To polecenie nie jest poprawne. --skip-auto-Increment nie istnieje. Wyrażenie regularne jest nieprawidłowe. Jak zauważył p91paul, modyfikator g należy dodać, aby zastąpić wszystkie wystąpienia. Zamiast tego użyj rozwiązania @JohnW.
Aalex Gabi
52

Odpowiedź JoDeva działała idealnie dla mnie z niewielkim dostosowaniem do wyrażenia regularnego sed:

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql
JohnW
źródło
1
Tak, nie jestem pewien, co to \brobi w oświadczeniu sed, ale zgodnie z sugestią @JohnW tutaj, usunięcie tego przełącznika również działa dla mnie.
David
4

Jest to opcja --create-options, która jest domyślnie dołączona do opcji --opt, która generuje definicje tabeli AUTO_INCREMENT.

Jeśli chcesz tylko tabele podstawowe,

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

Jeśli chcesz mieć widoki, wyzwalacze i procedury,

mysqldump -hlocalhost -uuser -ppass \
    --skip-opt --events --routines --no-data \
    schemaname
Erin Schoonover
źródło
3
Zwróć uwagę, że spowoduje to również usunięcie wszelkich pól automatycznego zwiększania wartości drop table, zestawów znaków itp.
Deanna
2

Dzięki temu wpisowi mogłem odpowiedzieć na moje pytanie:

Jak mogę sprawdzić wersję mojej bazy danych?

Potem właśnie stworzyłem ten skrypt: 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"

Następnie dodałem to do crontab:

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

Następnie w swoim repozytorium dodałem wynik, db_structure.sqldo gita i przed wprowadzeniem zmian do produktu zawsze sprawdzam, czy są jakieś zmiany strukturalne, o których zapomniałem zrobić na wszystkich dbs.

Gerardo Rosciano
źródło
-1

mysqldump -u [UŻYTKOWNIK] -p [HASŁO] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]

Zio Panzu
źródło
6
Spowoduje to również usunięcie flagi auto_increment na polach, w których jest włączona, a nie tylko wartość auto_increment na końcu.
Aquarion
--skip-optomówione tutaj i tutaj.
Chris