How to setup automatic MySQL backup on Ubuntu/Debian and CentOS

Overview

This tutorial is to guide you on setting up a simple, automatic MySQL database backups using mysqldump and a cron job.

Prerequisites

  • Installed and running MySQL server
  • SSH access
  • root or sudo user

Step 1: Backing up  a MySQL database

You can use the ‘mysqldump’ that comes in any standard MySQL installation to do a database dump from the shell. To backup the ‘exampledb’ database to a file do:

mysqldump -uroot -p exampledb > exampledb.sql

Note that there is no space between the ‘-u’ switch and the user (root). With the ‘-p’ switch and paramater after it the ‘mysqldump’ will prompt you to enter a password.

This command will output plain SQL queries in the exampledb.sql, but as they are text they can be compressed really good to save space. So to make a compressed backup, let’s do:

mysqldump -uroot -p exampledb | gzip > exampledb.sql.gz

You can use these commands to make manual backups of your databases. If you want to backup all databases on a server, use the ‘–all-databases’ switch instead of database name, like this:

mysqldump -uroot -p –all-databases| gzip > mysql_server.sql.gz

Step 2: Setting an automated scheduled backup of a MySQL database

Now that you know how to make manual database backups, let’s automate them with a cron job. You must set up a cron job that calls the ‘mysqldump’ tool on a schedule.

First let’s make a directory  for storing the backups:

mkdir /var/backups/mysql

As backups are more usefull when they provide history, let’s give the backup file with more meaningful name by adding the date and time when the backup was taken:

mysqldump -uroot -p exampledb | gzip > /var/backups/mysql/exampledb.$(date +”%Y_%m_%d_%I_%M”).sql.gz

To automate the backup process ‘mysqldump’ must have the user password inline, so it’s highly recommended to set up an additional user specifically for backups.

Open a crontab editor:

crontab -e

and add the following line at the bottom:

0 1 * * *    mysqldump -uroot -p exampledb | gzip > /var/backups/mysql/exampledb.$(date +”\%Y_\%m_\%d_\%I_\%M”).sql.gz

The “0 1 * * *” stands for a schedule on every 01:00 or everyday at one after midnight. The cron line format is “m h  dom mon dow   command”, where:

  • m – is for minutes
  • h – is for hour
  • dom – is the day of the month
  • mon – is the month
  • dow – day of the week

The  ‘*’ symbol in any of these means “on every” minute, hour, day and so.

 

Saving the crontab will set your backup on schedule and you are good to go.