You could earn up to $300 by adding new articles!

Get Started Now

Backup Multiple MySQL Or MariaDB Databases Automatically

Published on: Tue, Mar 29, 2016 at 10:59 pm EST


In this write-up, we'll walk through how to backup multiple MySQL or MariaDB databases that sit on the same machine using a custom bash script and setting up a cron job.

Database Backup(s)

We'll assume we have three MySQL databases on our Vultr instance named db-vultr-site, db-vultr-blog, db-vultr-app (Don't worry about creating these databases, you'll be able to substitute their names for yours hwere they are used in the script on Step 2 below).

  1. Log on to your MySQL or MariaDB database and run below query to create a database user db_user_backups to handle backups


    Also run below to make sure MySQL is configured to properly restore stored procedures

    SET GLOBAL log_bin_trust_function_creators = 1;
  2. Setup the necessarily directory structure and files needed

    # create backup directory with environment and log file
    sudo mkdir /backups && cd /backups
    sudo touch .env db-backup.log
    sudo chmod -R 775 /backups
    sudo chmod -R g+s /backups
    sudo chmod +x
    # add mysql backup user credentials into environment file
    echo "export MYSQL_USER=db_user_backups" > /backups/.env
    echo "export MYSQL_PASS={COMPLEX-PASSWORD}" >> /backups/.env
  3. Open nano /backups/ and paste the code below inside it, then save the file (Ctrl+X -> Y -> hit Enter).

    DB_NAMES=( 'db-vultr-site' 'db-vultr-blog' 'db-vultr-app' ) #replace with your own database name(s)
    # get total number of directories
    # create backup file names
    for (( i=0; i<${total_dbs}; i++ )); do
        BKUP_NAMES[$i]="`date +%Y%m%d%H%M`-backup-$${DB_NAMES[$i]}.sql.gz"
    # get backup users credentials
    source $BKUP_DIR/.env
    # create backups
    for (( i=0; i<${total_dbs}; i++ )); do
        # NOTE: --routines flag makes sure stored procedures are also backed up
        mysqldump --routines -u ${MYSQL_USER} -p${MYSQL_PASS} | gzip > ${BKUP_DIR}/${BKUP_NAMES[$i]}

    The code above is looping through an array with the name(s) of the database(s) you want to backup and doing so.

Cronjob Setup

Setup a cronjob to run every midnight that runs the backup script and saves the result/output to backup log.

  1. Open crontab

    crontab -e
  2. Add below entry to crontab

    0 0 * * * /usr/bin/env bash /backups/ &>> /backups/db-backup.log

    Note: While testing you can set cronjob to run every 1 minute instead like below

    * * * * * /usr/bin/env bash /backups/ &>> /backups/db-backup.log

    -OR- every 5 minutes (replace 5 with the number of minutes you want)

    */5 * * * * /usr/bin/env bash /backups/ &>> /backups/db-backup.log

What's Next

You will likely not want your backup(s) on the same server(s) running your database(s), but instead on a server in a different geographic location. There are several ways to do this, ranging from using SFTP, to using custom tools provided by the myriad of cloud storage providers available out there. One good alternative is Rsync as explained here -

Want to contribute ?

You could earn up to $300 by adding new articles!

Get started in the SSD Cloud!