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
Odpowiedz
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
)
Ten ostatni działał świetnie. Dzięki. – Paris
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
'' -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
mysq ldump -u [USER] -p [HASŁO] -d --skip-opt - pojedyncza transakcja [DB_SCHEMA]> [FILE.ESTENSIONE]
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
'--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
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
Zauważ, że to również powoduje spadek wszystkich pól automatycznego przyrostu, 'drop table's, zestawy znaków, itp. – Deanna
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
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.
Wygląda na to, że z MySQL 5.5 (serwer), '--no-dane' będzie domyślnie pomijało wartości auto_inrement. –
@JoeyAdams czy jesteś pewien? To nie jest zachowanie, którego doświadczam. – aland
@JoeyAdams MySQL 5.7. * Mysqldump nie wyłącza auto_increment przy użyciu --no-danych. –