Mysqldump per database shell

  • Sommigen onder ons gebruiken wel eens mysqldump om hun databases te backuppen.
    Maar als jullie net als mij zijn, haten jullie het dat dit allemaal in 1 groot bestand wordt gedumpt.
    Je dient dus of een apart commando te draaien per database, of je dient dit super bestand nadien te splitsen (onbegonnen werk).



    Echter kan dit veel eenvoudiger: er is een commando om elke database naar een apart bestand te backuppen.
    Ideaal dus als je backups wil maken van je websites en toch ze eenvoudig kunnen herstellen.
    Bovendien stelt dit je in staat om slechts 1 database te herstellen ipv ze allemaal.


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




    Als output krijg je netjes een bestand per database:

    Code
    ls -alh *.sql
    
    
    -rw-r--r-- 1 root root  44M Aug 24 22:39 db1.sql
    -rw-r--r-- 1 root root  44M Aug 24 22:39 db2.sql


    Je kan natuurlijk ook eenvoudig bepalen in welke map deze database backups (dumps) moeten worden geplaatst:

    Bash
    mysql -N -e 'show databases' | while read dbname; do mysqldump --complete-insert --routines --triggers --single-transaction "$dbname" > /home/dump/databases/"$dbname".sql; done

    Hiermee plaats je ze bv in de map /home/dump/databases.


    Natuurlijk gebruik je hiermee heel wat ruimte.
    Daarom pak ik ze persoonlijk graag terug in via gzip:

    Code
    mysql -N -e 'show databases' | while read dbname; do mysqldump --complete-insert --routines --triggers --single-transaction "$dbname" > "$dbname".sql; [[ $? -eq 0 ]] && gzip "$dbname".sql; done


    Herstellen van je databanken
    Niet onbelangrijk, maar soms wil je deze databanken terug gaan herstellen.
    Bv: als je verhuist naar een andere server.

    Bash
    $ for sql in *.sql; do dbname=${sql/\.sql/}; echo -n "Now importing $dbname ... "; mysql $dbname < $sql; echo " done."; done 
    
    
    De output komt dan per database tabel er netjes onder:
    Now importing db1 ...  done.
    Now importing db2 ...  done.


    Noot: soms dien je wel not te authenticeren (in te loggen) voordat de database backup begint.



    Korte lijntjes shell code dus om je leven veel eenvoudiger te maken.

  • Guest, wil je besparen op je domeinnamen? (ad)
  • Enkele kanttekeningen:
    --single-transaction werkt alleen voor databases met (enkel) tabellen met de InnoDB engine. Gebruik voor MyISAM-gebaseerde databases --lock-tables



    Daarnaast wil je er waarschijnlijk ook voor zorgen dat er geen actieve gebruikers in het systeem/de systemen bezig zijn op het moment van het maken van de backup(s). Bijvoorbeeld door downtime aan te kondigen en te zorgen dat deze systemen op die tijdstippen ook niet toegankelijk zijn.


    Het gebruik van > backup.sql (dus het gebruik van het groter-dan-teken) kan op sommige systemen voor problemen zorgen. Beter is wellicht het gebruiken van -r <file> of --result-file=<file>.


    Noot: soms dien je wel not te authenticeren (in te loggen) voordat de database backup begint.

    Dit kun je ondervangen door het uitlezen van een .cnf bestand middels --defaults-file=/path/to/db.cnf


    Hiermee voorkom je ook dat wachtwoorden gelogd worden (als je van plan was om gemakshalve deze credentials op te nemen in je shellscript wat misschien een minder goed idee is).

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!