Czasami konieczne jest szybkie wykonanie kopii bezpieczeństwa wszystkich baz danych MySQL na serwerze. Problemu nie ma, gdy baz jest kilka, jednak pojawia się przy ich większej ilości. Pomóc nam może prosty skrypt massdump.sh.
Dostępne parametry przy uruchomieniu:
- -o KATALOG_DOCELOWY
- -u NAZWA_UŻYTKOWNIKA
- -e KODOWANIE_ZNAKÓW
- -g włączenie kompresji gzip
- -b włączenie komprezji bzip2
Wystarczy wydać polecenie i gotowe: massdump.sh -u root -e utf8 -b
- #!/bin/bash
- MYSQLDUMP=`which mysqldump`
- MYSQL=`which mysql`
- USER=""
- PASSWORD=""
- OUTPUTDIR=${PWD}
- GZIP_ENABLED=0
- BZIP2_ENABLED=0
- ENCODING="latin1"
- STAMP=$(date +%Y_%m_%d_%H)
- while getopts u:e:o:gb OPTION
- do
- case ${OPTION} in
- u) USER=${OPTARG};;
- e) ENCODING=${OPTARG};;
- o) OUTPUTDIR=${OPTARG}; mkdir -p $OUTPUTDIR;;
- g) GZIP_ENABLED=1; USEZIPX="gzip"; ZIPE="gz";;
- b) BZIP2_ENABLED=1; USEZIPX="bzip2" ZIPE="bz2";;
- *) exit 2;;
- esac
- done
- if [ "$USER" != '' ]; then
- echo "Enter password for" $USER":"
- oldmodes=`stty -g`
- stty -echo
- read PASSWORD
- stty $oldmodes
- fi
- DBS=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | grep -Ev "(information_schema|Database)"`
- for db in $DBS; do
- echo "Backup database: $db / $ENCODING encoding"
- if [ $GZIP_ENABLED == 1 ] || [ $BZIP2_ENABLED == 1 ]; then
- $MYSQLDUMP --force --opt
- --user=$USER --password=$PASSWORD --databases $db
- --default-character-set=$ENCODING -N | $USEZIPX > "$OUTPUTDIR/$STAMP-$db.$ZIPE"
- else
- $MYSQLDUMP --force --opt
- --user=$USER --password=$PASSWORD --databases $db
- --default-character-set=$ENCODING -N > "$OUTPUTDIR/$STAMP-$db.sql"
- fi
- done
Komentarze
Dobrze było by wspomnieć o alternatywie, dostępnej np. w domyślnym repo w Debianie: automysqlbackup.
Oprócz tego że idealnie działa w cronie to też nadaje się do zrobienia kopii wszystkich* baz na teraz.
*) Domyślnie nie robi kopie bazy mysql. A czasem to może być bardzo potrzebne i należy o tym pamiętać.