2013-03-27 9 views
59

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

+0

Wygląda na to, że z MySQL 5.5 (serwer), '--no-dane' będzie domyślnie pomijało wartości auto_inrement. –

+0

@JoeyAdams czy jesteś pewien? To nie jest zachowanie, którego doświadczam. – aland

+2

@JoeyAdams MySQL 5.7. * Mysqldump nie wyłącza auto_increment przy użyciu --no-danych. –

Odpowiedz

49

Można 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 robót poprawnie, dodać g (dla g skroniowe zastępczej) parametr tak:

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

(działa tylko wtedy, gdy masz zainstalowane narzędzia GUI: mysqldump --skip-auto-increment)

+0

Ten ostatni działał świetnie. Dzięki. – Paris

+10

Nie sądzę, że '--skip-auto-increment' jest realną opcją. Nie mogę go znaleźć w [dokumentacji] (http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html). Żadne z dwóch błędów MySQL w tym wydaniu nie wspomina o tym: [20786] (http://bugs.mysql.com/bug.php?id=20786), [30957] (http://bugs.mysql.com/bug .php? id = 30957). Która wersja mysqldump ma tę opcję? – Rich

+1

'' -skip-auto-increment' jest opcją dodaną w MySQL GUI Tools, jeśli pamiętasz poprawnie. (nie jestem pewien ^^) W rzeczywistości tak naprawdę to nie jest rozwiązanie! Ale drugie polecenie inline jest poprawne, założyłem go [tutaj] (http: //bugs.mysql.com/bug.php? id = 20786), gdzie temat mówi o problemie ** autoinkrement ** i zapewnia ideę filtrowania "sed"! – JoDev

-1

mysq ldump -u [USER] -p [HASŁO] -d --skip-opt - pojedyncza transakcja [DB_SCHEMA]> [FILE.ESTENSIONE]

+6

Spowoduje to również usunięcie flagi auto_increment na polach, na których jest włączona, a nie tylko wartości auto_increment na końcu. – Aquarion

+0

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

3

Jest to - opcje -opracowania, które są zawarte w - opt, domyślnie, który generuje definicje tabel AUTO_INCREMENT.

Jeśli chcesz tylko tabele bazowe,

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 widoki, wyzwalaczy i procedur też

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

Zauważ, że to również powoduje spadek wszystkich pól automatycznego przyrostu, 'drop table's, zestawy znaków, itp. – Deanna

32

odpowiedź JoDev pracował idealnie dla mnie z małym dostosowaniem do sed regularne wyrażenie:

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

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

Jak mogę wykonać kontrolę wersji na moim db?

Wtedy właśnie stworzył 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" 

Potem dodałem to do crontab:

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

Wtedy w moim repo dodałem wynik, db_structure.sql do git i przed popychanie Zmiany w prod Zawsze sprawdzam, czy są jakieś zmiany strukturalne, o których zapomniałem we wszystkich przypadkach.