2013-05-10 7 views
6

Standardowe polecenia mysqldump że używam tomysqldump - Dump wielu baz danych z odrębnych kont mysql do jednego pliku

mysqldump --opt --databases $dbname --host=$dbhost --user=$dbuser --password=$dbpass | gzip > $filename 

Aby zrzucić wiele baz danych

mysqldump --opt --databases $dbname1 $dbname2 $dbname3 $dbname_etc --host=$dbhost --user=$dbuser --password=$dbpass | gzip > $filename 

Moje pytanie brzmi: w jaki sposób zrzucić wielu baz danych z różnych kont MySQL do jednego pliku?

AKTUALIZACJA: Kiedy miałem na myśli 1 plik, mam na myśli 1 spakowany plik z różnicą sql zrzutu dla różnych witryn w nim.

Odpowiedz

1
  1. Dla każdego konta serwera MySQL, zrzutu bazy danych w oddzielnych plikach

  2. Dla każdego pliku zrzutu, należy wykonać polecenie:

    cat dump_user1.sql dump_user2.sql | gzip > super_dump.gz

istnieje podobne stanowisko na stronie Superuser.com: https://superuser.com/questions/228878/how-can-i-concatenate-two-files-in-unix

+0

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

+0

Dlaczego nie, zrzucić kompresję db w/o i skompresować kilka plików razem? – GregD

+0

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

6

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"