1. Cześć Gość. Przeglądasz forum dzięki firmie QNAP oraz zespołowi QNAP Club Polska.

MySQLdump - automatyczne kopie baz danych

Dyskusja w 'MySQL & phpMyAdmin' rozpoczęta przez użytkownika siwylodz, 5 Listopad 2009.

Ładowanie...
  1. siwylodz
    Offline

    siwylodz Zarejestrowany Noobie

    Dołączył:
    23 Kwiecień 2009
    Wiadomości:
    38
    Miejscowość:
    Łódź
    Local Time:
    22:40
    Oceny:
    +0 / 0 / -0
    Followers:
    0
    QNAP:
    null
    Synology:
    DS209+II, DS415play, DS415+
    Ethernet:
    40 GbE
    null 40 GbE
    Witam

    Tak jak obiecałem w artykule CRON - przywracanie zadań po restarcie serwera zamieszczam mały patent na automatyczne zrzuty baz danych MySQL.

    Skrypcik bazuje na wykorzystaniu mysqldump'a i kilku innych rozwiązaniach pozwalających na:
    • 1. zrzut kompletnej bazy danych z serwera Synka lub zewnętrznego serwera MySQL'a,
      2. jej kompresję do [GZ]
      3. i "kolekcjonowanie".... tzn automatyczną rotację tworzonych archiwów,
    który po dopisaniu do zadań crona pozwoli Adminom baz
    zająć się rozrywkami innymi niż Backup'y i ich nadzorowanie.

    Poniżej kod przykładowego skryptu zmontowany z kilku myków znalezionych w sieci.
    Kod (Text):
    1. #!/bin/sh
    2. #
    3. # Skrypy automatycznej kopii wskazanej bazy MySQL
    4. #
    5. # parametry do połączenie z bazą
    6. SERVER=mysql.twojadomena.pl
    7. LOGIN=root
    8. HASLO=haslodobazy
    9. BAZA=nazwabazy
    10.  
    11. # ILEKOPII - ilość przechowywanych kopii
    12. # BACKUPDIR - lokalizacja plików kopii zapasowych
    13. ILEKOPII=7
    14. BACKUPDIR=/volume1/homes/admin/bazy_mysql
    15.  
    16. KOPIE=`find $BACKUPDIR -name "$BAZA-*.gz" | wc -l | sed 's/\ //g'`
    17. while [ $KOPIE -ge $ILEKOPII ]
    18. do
    19. ls -tr1 $BACKUPDIR/$BAZA-*.gz | head -n 1 | xargs rm -f
    20. KOPIE=`expr $KOPIE - 1`
    21. done
    22. DATE=`date +%Y%m%d%H%M%S`
    23. rm -f $BACKUPDIR/.$BAZA-${DATE}.gz_TEMP
    24. /usr/syno/mysql/bin/mysqldump --opt -h$SERVER -u$LOGIN -p$HASLO --databases $BAZA | gzip -c -9 > $BACKUPDIR/.$BAZA-${DATE}.gz_TEMP
    25. mv -f $BACKUPDIR/.$BAZA-${DATE}.gz_TEMP $BACKUPDIR/$BAZA-${DATE}.gz
    26. exit 0
    kod poprawiony dzięki spostrzegawczości pitera76

    Powyższy kodzik zapisujemy do pliku np: baza33.sh
    Kod (Text):
    1. /volume1/homes/admin/baza33.sh
    przygotowujemy plik do uruchamiania
    Kod (Text):
    1. chmod 775 baza33.sh
    a poniższy kod dorzucamy celem zautomatyzowania opreacji do zadań cron'a, polecam looknąć w ten artykulik -> CRON - przywracanie zadań po restarcie serwera - znajdziecie tam więcejinformacji.
    Kod (Text):
    1. 55       17       *       *       *       root    /volume1/homes/admin/baza33.sh
    Zapraszam do testowania i wyrażania opinii :)
    u mnie jak na razie sprawdza się wyśmienicie.

    pozdrawiam
     
  2. sirm
    Offline

    sirm System Engineer Q Specialist

    Dołączył:
    23 Maj 2009
    Wiadomości:
    166
    Local Time:
    22:40
    Oceny:
    +1 / 0 / -0
    Followers:
    0
    QNAP:
    null
    Synology:
    DS209+II
    Ethernet:
    1 GbE
    null 1 GbE
    Zrobiles to o czym ja caly czas myslalem, aby tu wrzucic. Nie mialem tylko czasu sprawdzic mojego skryptu w synku.
    Ogolnie na innych systemach mam taki jak Twoj, tylko prosciej napisany :)
    Polecam takie rozwiazanie, bo dziala sprawnie i bezproblemowo.
     
  3. piter76
    Offline

    piter76 System Engineer Q Specialist

    Dołączył:
    27 Lipiec 2009
    Wiadomości:
    121
    Local Time:
    22:40
    Oceny:
    +1 / 0 / -0
    Followers:
    1
    Synology:
    DS107+
    Może się mylę, ale według mnie powyższy skrypt próbuje zrobić kopię wszystkich baz, nie zaś konkretnej wymienionej w definicji $BAZA
    Wynika to z zapisu w tej lnii skryptu:
    Kod (Text):
    1.  
    2. /usr/syno/mysql/bin/mysqldump --opt -h$SERVER -u$LOGIN -p$HASLO --all-databases | gzip -c -9 > $BACKUPDIR/.$BAZA-${DATE}.gz_TEMP
    3.  
    a konkretniej parametr --all-databases decyduje o tym. Jeśli zaś mamy zamiar zrobic kopię konkretnej bazy, linia ta powinna mieć postać:
    Kod (Text):
    1.  
    2. mysqldump -h $SERVER -u $LOGIN -p$HASLO --databases $BAZA | gzip -c -9 > $BACKUPDIR/.$BAZA-${DATE}.gz_TEMP
    3.  
     
  4. siwylodz
    Offline

    siwylodz Zarejestrowany Noobie

    Dołączył:
    23 Kwiecień 2009
    Wiadomości:
    38
    Miejscowość:
    Łódź
    Local Time:
    22:40
    Oceny:
    +0 / 0 / -0
    Followers:
    0
    QNAP:
    null
    Synology:
    DS209+II, DS415play, DS415+
    Ethernet:
    40 GbE
    null 40 GbE
    nie mylisz się :)
    tworzyłem kilka wersji pod swoje serwery i finalnie pomięszałem trochę kodzik
    poszła wersja do zrzucania wszstkich baz dostępnych na serwerze dla danego $LOGIN'u

    dla Pitera76 + za spostrzegawczość i + za czujność :)
    kod poprawiłem i dorzuciłem info o korekcie
     
  5. andy827
    Offline

    andy827 Nowy użytkownik Noobie

    Dołączył:
    27 Maj 2009
    Wiadomości:
    2
    Local Time:
    22:40
    Oceny:
    +0 / 0 / -0
    Followers:
    0
    Synology:
    109j
    Dziękuję za wspaniałe narzędzie.
    Proste i niezawodne - o to mi chodziło.
    Pozdrawiam
     
  6. unr3al2
    Offline

    unr3al2 Guest

    Oceny:
    +0 / 0 / -0
    Followers:
    0
    Dodam jeszcze tutaj informację jak przywrócić taki backup :

    1. Dla przywrócenia bazy danych dla tabeli:
    Kod (Text):
    1. gunzip < BAZA.gz | mysql -u root -pNASZEHASŁO tabela
    2. Dla przywrócenia całego pliku (wszystkie bazy):
    Kod (Text):
    1. gunzip < BAZA.gz | mysql -u root -pNASZEHASŁO
     
  7. kda
    Offline

    kda Entry Technician Q Associate

    Dołączył:
    13 Marzec 2012
    Wiadomości:
    49
    Local Time:
    22:40
    Oceny:
    +0 / 0 / -0
    Followers:
    0
    Synology:
    DS712+
    Witam,
    Na początku proszę o wyrozumiałość dla mnie nawet jak zadam na pozór błahe pytanie, otóż zaczynam zabawę z Synology a z Linuxem nie miałem wcale do czynienia.
    Mam pytanko odnośnie przywracania utworzonej kopii bazy, mam plik gdzie prawdopodobnie mam wszystkie tabele (przynajmiej tak mi się wydaje bo rozmiar pliku jest większy niż przy jednej tabeli). Teraz czy to co napisał @unr3al2 gdzie trzeba użyć (wpisać) próbowałem w pliku skryptu przywroc.sh , ale nie działa :oops:
    Kod (Text):
    1.  
    2. gunzip < zamowienia-20120318203149.gz | mysql -u root -pudar123 tabela
    3.  
    plik ze skryptem mam umieszczony w tym samym katalogu to kopia bazy, próbowałem wpisywać pełną ścieżkę ale też nic z tego :evil:
     
  8. unr3al2
    Offline

    unr3al2 Guest

    Oceny:
    +0 / 0 / -0
    Followers:
    0
    Odp: Re: MySQLdump - automatyczne kopie baz danych

    Teraz bedzie ok

    Wysłane z mojego GT-N7000 za pomocą Tapatalk
     
  9. kda
    Offline

    kda Entry Technician Q Associate

    Dołączył:
    13 Marzec 2012
    Wiadomości:
    49
    Local Time:
    22:40
    Oceny:
    +0 / 0 / -0
    Followers:
    0
    Synology:
    DS712+
    Serdeczne dzięki za szybką odpowiedź, poprawiłem skrypt zgodnie z Twoimi zaleceniami przywracanie całej bazy (wszystkich tabel) działa, ale z tego samego pliku archiwum jak chcę przywrócić jedną tabelę to niestety nie działa. Czy żeby przywrócić pojedyńczą tabelę musi być w archiwum zarchiwizowana konkretna tabela ?
     
  10. mikhnal
    Offline

    mikhnal Guest

    Oceny:
    +0 / 0 / -0
    Followers:
    0

    mikhnal: wklejam wypowiedź unr3al2'a ze skasowanego postu:


    Z tego co pamiętam to musi być zarchiwizowana konkretna baza.
     
  11. kda
    Offline

    kda Entry Technician Q Associate

    Dołączył:
    13 Marzec 2012
    Wiadomości:
    49
    Local Time:
    22:40
    Oceny:
    +0 / 0 / -0
    Followers:
    0
    Synology:
    DS712+
    Szkoda, bo skoro jest możliwość archiwizacji wszystkich tabel pod jednym plikiem, to można by było przywrócić konkrętną wybraną tabele z takiej archiwizacji. Ale skoro nie idzie, trudno.
     
  12. kda
    Offline

    kda Entry Technician Q Associate

    Dołączył:
    13 Marzec 2012
    Wiadomości:
    49
    Local Time:
    22:40
    Oceny:
    +0 / 0 / -0
    Followers:
    0
    Synology:
    DS712+
    Ja u siebie robię kopię wszystkich baz danych na dysk zewnętrzny podłączony po USB, w cronie zapodałem skrypt który raz na dobę zrzuca mi do katalogu z datą wszystkie bazy w tabelami. Jeżeli chcę coś przywrócić zatrzymuję MySQL i na żywca podmieniam konkretne pliki z tabelami.
    Oto skrypt może komuś się przyda:

    Kod (Text):
    1. #!/bin/sh
    2. /usr/syno/etc/rc.d/S21mysql.sh stop
    3.  
    4. KTO=mysql
    5. ILEKOPII=120
    6. BACKUPDIR=/volumeUSB1/usbshare/Kopia_MySQL_all
    7.  
    8. KOPIE=`find $BACKUPDIR -name "$KTO-*" -type d | wc -l | sed 's/\ //g'`
    9. while [ $KOPIE -ge $ILEKOPII ]
    10. do
    11. ls -dtr1 $BACKUPDIR/$KTO-* | head -n 1 | xargs rm -f -r
    12. KOPIE=`expr $KOPIE - 1`
    13. done
    14. DATE=`date +%Y%m%d%H%M%S`
    15. mkdir $BACKUPDIR/$KTO-${DATE}
    16.  
    17. cp -a /var/services/$KTO/*  $BACKUPDIR/$KTO-${DATE}
    18.  
    19. /usr/syno/etc/rc.d/S21mysql.sh start
    20. exit 0
     
  13. grzenio
    Offline

    grzenio Staff Administrator

    Dołączył:
    6 Wrzesień 2012
    Wiadomości:
    718
    Miejscowość:
    Borkowo
    Local Time:
    22:40
    Oceny:
    +43 / 0 / -0
    Followers:
    4
    QNAP:
    TVS-x82
    Ethernet:
    802.11ac
  14. Fixer
    Offline

    Fixer Systems Admin... Q's Expert

    Dołączył:
    2 Luty 2013
    Wiadomości:
    344
    Miejscowość:
    TG
    Local Time:
    22:40
    Oceny:
    +6 / 0 / -0
    Followers:
    2
    QNAP:
    null
    Synology:
    DS1515+
    Ethernet:
    10 Mbps
    null 10 Mbps

Poleć tę stronę