Mam bazę danych MySQL i próbuję znaleźć sposób na wyeksportowanie tylko jej struktury, bez wartości autoinkrementacji. mysqldump --no-data
prawie 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ć)?
88
--no-data
domyślnie pominie wartości auto_increment.Odpowiedzi:
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.
\b
Jest 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
źródło
--skip-auto-increment
jest 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ę?--skip-auto-increment
jest 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ęsed
filtrowania!Odpowiedź JoDeva działała idealnie dla mnie z niewielkim dostosowaniem do wyrażenia regularnego sed:
źródło
\b
robi w oświadczeniu sed, ale zgodnie z sugestią @JohnW tutaj, usunięcie tego przełącznika również działa dla mnie.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
źródło
drop table
, zestawów znaków itp.Dzięki temu wpisowi mogłem odpowiedzieć na moje pytanie:
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:
Następnie w swoim repozytorium dodałem wynik,
db_structure.sql
do gita i przed wprowadzeniem zmian do produktu zawsze sprawdzam, czy są jakieś zmiany strukturalne, o których zapomniałem zrobić na wszystkich dbs.źródło
mysqldump -u [UŻYTKOWNIK] -p [HASŁO] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]
źródło
--skip-opt
omówione tutaj i tutaj.