9 Jan 2011

Quick dump or backup all databases in MySQL server

Dump all databases to one file

mysqldump -u root -pPASSWORD --all-databases | gzip > database_`date -I`.sql.gz

Dump all MySQL databases to many separate files (one file for database)

You can use this script mydump2many.sh. Here is source code:
#!/bin/bash

# Author: Tomasz Gaweda
# Date:   2011-01-08

# change this
# THIS IS NOT SECURE THINK 
# ABOUT CREATING ~/.my.cnf file.
MY_USER="root"
MY_PASS="PASSWORD"
MY_HOST="127.0.0.1"

if [ $# -lt 1 ] ; then 
 echo "usage: "$0" directory_to_backup"
 exit 1
fi

MY_BAK_DIR=$1

GZIP="$(which gzip)"
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"

NOW=`date -I` # mm-dd-yyyy format

MY_DBS="$($MYSQL -u $MY_USER -h $MY_HOST -p$MY_PASS -Bse 'show databases')"
if [ ! -d "$MY_BAK_DIR" ] ; then
 mkdir -p "$MY_BAK_DIR"
fi

for DB in $MY_DBS ; do
        FILE="${MY_BAK_DIR}/${NOW}_${DB}.gz"

 # ignore this databases in backup
 case "$DB" in 
  "mysql")   continue ;;
  "information_schema") continue ;;
 esac  
 
 echo -e "Please wait while dumping ${DB} ... "
 if [ -f "$FILE" ] ; then
  # file already exists we are probably resuming
  echo "SKIP" 
  continue;
 fi
 START=$(date +%s)
 $MYSQLDUMP -u $MY_USER -h $MY_HOST -p$MY_PASS $DB | $GZIP -9 > "${FILE}"
 RC=${PIPESTATUS[0]}
 END=$(date +%s)
 DIFF=$(( $END - $START ))

 echo -ne "Dump of ${DB} ... " 
 if [ $RC -eq 0 ] ; then
  # backup OK
  echo "SUCCEDED took ${DIFF} seconds"
 else
  # something went wrong - delete partial backup file
  rm -f "${FILE}"
  echo "FAILED"
  exit 1 # exit on error
 fi
done
Usage:
$ bash mydump2many.sh backup
Please wait while dumping Medchem ...
Dump of Medchem ... SUCCEDED took 0 seconds
Please wait while dumping People ...
Dump of People ... SUCCEDED took 401 seconds
Please wait while dumping TextMining ...
Dump of TextMining ... SUCCEDED took 3027 seconds

Using logrotate utility to make MySQL server backup

If you are searching for comprehensive backup solution on Linux/Unix including rotation of older databases dumps you could use logrotate utility for backup here is example provided by Vivek. Remember this solution is not the best option (in fact it forces logrotate to do things, that it shouldn't do)! It is rather quick and dirty method for getting things done at low cost.
/var/backups/db.sql.gz {
    daily
    rotate 14
    nocompress
    create 640 root adm
    postrotate
    mysqldump db -u user -psecret >/var/backups/db.sql
    gzip -9f /var/backups/db.sql
    endscript
}

1 comment:

  1. Now I have found more flexible solution for making MySQL backup AutoMySQLBackup.

    ReplyDelete