Backup Multiple MySQL Or MariaDB Databases Automatically
in omd with 0 comment

Backup Multiple MySQL Or MariaDB Databases Automatically

in omd with 0 comment


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 - []