Nikt chyba nie wyjaśnił tego, więc zamierzam dać moje 2 centy.
Należy zauważyć, że moje doświadczenia są w BASH i mogą być do nich wyłączne, więc zmienne i pętle mogą działać inaczej w danym środowisku.
Najlepszym sposobem na uzyskanie archiwum z oddzielnymi plikami wewnątrz jest użycie ZIP lub TAR, wolę używać smoły ze względu na jej prostotę i dostępność.
Sam Tar nie kompresuje, ale w pakiecie z bzip2 lub gzip może zapewnić doskonałe wyniki. Ponieważ twój przykład używa gzip, użyję tego w mojej demonstracji.
Po pierwsze pozwala zaatakować problem zrzutu MySQL, polecenie mysqldump nie rozdziela plików (według mojej wiedzy anyways). Zróbmy zatem mały sposób na utworzenie jednego pliku na bazę danych.
mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > ${db}.sql; done
Więc teraz mamy ciąg, który pokaże baz danych na plik, i eksport tych baz do miejsca, gdzie zawsze trzeba po prostu edytować część po> symbol
Następny pozwala dodać trochę przyjrzeć składni w przypadku modelu TAR
tar -czf <output-file> <input-file-1> <input-file-2>
z powodu tej konfiguracji pozwala nam określić dużą liczbę plików do zarchiwizowania.
Opcje są podzielone w następujący sposób.
c - Kompresja/Utwórz Archiwum
oo - GZIP kompresji
f - Wyjście do pliku
j - kompresja bzip
Naszym kolejnym problemem jest utrzymanie listę wszystkich nowo utworzyliśmy pliki, rozszerzymy naszą instrukcję while, aby dołączyć ją do zmiennej podczas przechodzenia przez każdą bazę danych znajdującą się w MySQL.
DBLIST=""; mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB"; done
Teraz mamy zmienną DBLIST że możemy użyć mieć moc wszystkich naszych plików, które zostaną utworzone, możemy modyfikować nasze oświadczenie 1 linia uruchomić polecenie tar po wszystko, co zostało obsłużone.
DBLIST=""; mysql -s -r -p$dbpass --user=$dbuser -e 'show databases' | while read db; do mysqldump p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB"; done && tar -czf $filename "$DBLIST"
Jest to bardzo niebezpieczne podejście i nie pozwalają na ręczne określenie bazy danych, tak, aby to osiągnąć, stosując następujące polecenie stworzy Ci plik TAR, który zawiera wszystkich określonych baz danych.
DBLIST=""; for db in "<database1-name> <database2-name>"; do mysqldump -p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB.sql"; done && tar -czf $filename "$DBLIST"
przelotowego baz danych MySQL z bazy danych MySQL pochodzi z następującym stackoverflow.com pytanie „mysqldump with db in a separate file”, który został po prostu zmodyfikowany w celu dostosowania ich do potrzeb.
I mieć skrypt automatycznie go oczyścić w 1 wykładziny wystarczy dodać następujące po zakończeniu polecenia
&& rm "$DBLIST"
podejmowania wygląd komend jak ten
DBLIST=""; for db in "<database1-name> <database2-name>"; do mysqldump -p$dbpass --user=$dbuser $db > ${db}.sql; DBLIST="$DBLIST $DB.sql"; done && tar -czf $filename "$DBLIST" && rm "$DBLIST"
Ugh, mój błąd . Nie określiłem struktury jednego pliku, który chciałem. Zaktualizowałem moje pytanie, aby je wyjaśnić. – arvinsim
Dlaczego nie, zrzucić kompresję db w/o i skompresować kilka plików razem? – GregD
Czy można to zrobić tylko w jednej linii? Zasadniczo nie chcę zrzucać plików do folderu, a następnie je spakować. Chciałbym, aby wysyłał tylko gotowy, skompresowany plik. Nie znam uniksów, ale można to zrobić z rurami? – arvinsim