2012-06-03 13 views
24

Piszę polecenie pojedynczego wiersza, który tworzy kopie zapasowe wszystkich baz danych w ich odpowiednich nazwach zamiast za pomocą dumpingu wszystko w jednym sql.mysqldump z db w osobnym pliku

Np db1 zapisywane do db1.sql i DB2 zostaje zapisany do db2.sql

tej pory ja zebrane następujące polecenia, aby pobrać wszystkie bazy danych.

mysql -uuname -ppwd -e 'show databases' | grep -v 'Database' 

Zamierzam to rury z awk coś zrobić jak

awk '{mysqldump -uuname -ppwd $1 > $1.sql}' 

Ale to nie działa.

Jestem nowy na basha, więc mógłbym się mylić w moim myśleniu.
Co należy zrobić, aby eksportować bazę danych w odpowiednich nazwach?

aktualizacja:
Ok, nareszcie udało się to zrobić działając z podpowiedzi poniżej.
Jest to ostatni scenariusz

# replace [] with your own config 
# replace own dir to save 
# echo doesn't work. hmm... 

mysql -u[uname] -p'[pwd]' -e "show databases" \ 
| grep -Ev 'Database|information_schema' \ 
| while read dbname; \ 
do \ 
echo 'Dumping $dbname' \ 
mysqldump -u[uanme] -p'[pwd]' $dbname > ~/db_backup/$dbname.sql;\ 
done 

odbijając część nie działa choć.

+0

Echo nie działa, ponieważ jest przekierowany do ~/db_backup/$ dbname.sql. Twój mysqldump prawdopodobnie też nie działa - tak jak jest tutaj napisany, jest po prostu argumentem do echa. Polecam użyć argumentu mysqldump --result-file zamiast przekierowania, aby po prostu wyjaśnić, co się dzieje. –

+0

przynajmniej musisz dodać ";" po echo "Dumping $ dbname" – Nadir

Odpowiedz

0

Nie jest to odpowiedź na twoje pytanie, ale spójrz na projekt AutoMySQLBackup na Sourceforge, zamiast ponownego wynajdywania koła. Robi to, co chcesz, i oferuje mnóstwo dodatkowych funkcji, w tym powiadomienia o kompresji, szyfrowaniu, rotacji i e-mailach. Użyłem go jakiś czas temu i działało naprawdę dobrze.

0

Wygląda dobrze. Jedyne, co mogę teraz znaleźć (bez testowania), to to, że brakuje ci półkolisty po Pokaż tabele.

35
mysql -uroot -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done 
+7

Przekazanie '-N' do' mysql' spowoduje pominięcie nagłówka kolumny "Baza danych". –

+0

Dzięki Vinicius. Otrzymałem komunikat "mysqldump: Masz błąd: 1049: Nieznana baza danych" Baza danych "podczas wybierania bazy danych" i nie mogłem ustalić przyczyny. – Phil

0

Poszukując dostępnych pakietów dla projektu AutoMySQLBackup sugerowanej przez @Jeshurun ​​Przyjechałem po drugiej stronie Holland.

Zaintrygowana nazwą (mieszkam w Belgii na południu Holandii, czasami - lub lepiej niektóre części - określane jako "Holandia"), postanowiłem to sprawdzić. Być może może ci również pomóc.

16

Tworzenie kopii zapasowych na bazę danych jest rzeczywiście znacznie bardziej wydajne. Nie tylko łatwiej jest przywrócić, gdy jest to potrzebne, ale także doświadczyłem, że wykonanie kopii zapasowej całej bazy danych zostanie przerwane na wypadek, gdyby jedna tabela została uszkodzona/uszkodzona. Tworząc kopie zapasowe dla każdej bazy danych, złamie się tylko dla tej bazy danych, a reszta jest nadal ważna.

oneliner stworzyliśmy do tworzenia kopii zapasowych naszych baz danych MySQL:

mysql -s -r -u bupuser -pSecret -e 'show databases' | while read db; do mysqldump -u bupuser -pSecret $db -r /var/db-bup/${db}.sql; [[ $? -eq 0 ]] && gzip /var/db-bup/${db}.sql; done 

Najlepiej utworzyć nowy użytkownik mysql tylko do odczytu 'bupuser' z passsword 'Tajemnicy' (zmiana!). Najpierw pobierze listę baz danych. Następnie zapisz i dla każdej bazy danych utwórz plik dump.sql do/var/db-bup (możesz zmienić). I tylko wtedy, gdy nie napotkasz żadnych błędów, spakuj również plik, który naprawdę drastycznie uratuje pamięć masową. Gdy niektóre bazy danych napotkały błędy, zobaczysz plik .sql, a nie plik .sql.qz.

+0

bardzo dobrze! – Mike

+0

To było prawie idealne - dodajmy GREP, aby uniknąć tabel systemowych: mysql -s -r -u root-proot -e 'pokaż bazy danych' | grep -Ev 'Baza danych | mysql | information_schema | phpmyadmin' | podczas odczytu db; do mysqldump -u root -proot $ db -r /var/www/html/${db}.sql; [[$? -eq 0]] && gzip /var/www/html/${db}.sql; zrobione – Nadir

+1

** To jest moja ostatnia wersja **: mysql -s -r -u root-proot -e 'pokaż bazy danych' | grep -Ev 'Baza danych | information_schema | performance_schema | phpmyadmin' | grep -v '^ mysql $' | podczas odczytu db; do mysqldump -u root -proot $ db | gzip> /var/dump/${db}.sql.gz; done – Nadir

8

Oto prosty skrypt, który będzie:

  • wysypisko wszystko DB kompres wyjście ->SCHEMA_NAME.sql.gz
  • użycie [AUTOCOMMIT/unique_checks/foreign_key_checks], aby przyspieszyć import
  • wykluczyć domyślnych schematów

Plik: Dump_all.sh

Jak używać:
./Dump_all.sh -> zrzuci wszystkie DB
./Dump_all.sh schema_name -> zrzuci schema_name DB

#!/bin/bash 
MYSQL_USER="root" 
MYSQL_PASS="YOUR_PASS" 

echo "-- START --" 

echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > tmp_sqlhead.sql 
echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;" > tmp_sqlend.sql 

if [ -z "$1" ] 
    then 
    echo "-- Dumping all DB ..." 
    for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names); 
    do 
     if [ "$I" = information_schema ] || [ "$I" = mysql ] || [ "$I" = phpmyadmin ] || [ "$I" = performance_schema ] # exclude this DB 
     then 
     echo "-- Skip $I ..." 
     continue 
     fi 
     echo "-- Dumping $I ..." 
     # Pipe compress and concat the head/end with the stoutput of mysqlump ('-' cat argument) 
     mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
    done 

else 
     I=$1; 
     echo "-- Dumping $I ..." 
     # Pipe compress and concat the head/end with the stoutput of mysqlump ('-' cat argument) 
     mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
fi 

# remove tmp files 
rm tmp_sqlhead.sql 
rm tmp_sqlend.sql 

echo "-- FINISH --" 
0

To co używam, to bardzo proste i działa dobrze dla mnie.

mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname"> "$(date +%Y%m%d)-$dbname".sql; done

Z opcją kompresji:

mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname" | gzip> /tmp/"$(date +%Y%m%d)-$dbname".sql.gz; done

Jeśli nie dodać hasło w poleceniu, trzeba go wpisać jeden plus całkowita liczba baz danych masz.

1

Oto co pracował dla mnie

mysql -s -r -uroot -e 'show databases' -N | while read dbname; do 
    mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql; 
done