MySQL/MariaDB Backup Script

MySQL

Set the MySQL username/password and backup path.

Web

The WWW_PATH variable is optional. If you want to only backup MySQL databases then the variable can be removed.

S3

The s3cmd command below is set to delete removed files. This means that any files inside the bucket will be deleted if they do not exist on disk. S3 is optional. Remove the S3_BUCKET variable and it will not execute the s3cmd code.

Script

Old backups are automatically deleted after 30 days

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
USER=USERNAME
PASSWORD=PASSWORD
BACKUP_PATH=/root/backup
WWW_PATH=/var/www
DATE=`date +"%H-%M-%S_%d-%m-%Y"`
DAYS=30
DATABASES=`mysql -u $USER -p$PASSWORD --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema"`
S3_BUCKET=S3_BUCKET_NAME
if [ ! -d $BACKUP_PATH ]; then
mkdir -p $BACKUP_PATH
fi
if [ -d $BACKUP_PATH ]; then
if [ ! -z $WWW_PATH ] && [ -d $WWW_PATH ]; then
tar -jcf $BACKUP_PATH/www-$DATE.tar.bz2 $WWW_PATH
fi
for db in $DATABASES; do
mysqldump -u $USER -p$PASSWORD --skip-lock-tables $db | bzip2 -c > $BACKUP_PATH/$db-$DATE.sql.bz2
done
find $BACKUP_PATH/* -mtime +$DAYS -type f -delete
if [ ! -z $S3_BUCKET ]; then
s3cmd sync --delete-removed $BACKUP_PATH/ s3://$S3_BUCKET/
fi
fi

Cron

  • Every 6 hours.
    • 0 */6 * * * /root/run_backup
  • Every day.
    • 0 0 * * * /root/run_backup

Output

1
2
3
4
5
total 155512
-rw-r--r-- 1 root root 106638 Sep 7 14:40 mysql-14-39-18_07-09-2016.sql.bz2
-rw-r--r-- 1 root root 1409334 Sep 7 14:40 xxxxxxxx-14-39-18_07-09-2016.sql.bz2
-rw-r--r-- 1 root root 32935172 Sep 7 14:40 xxxxxxxx-14-39-18_07-09-2016.sql.bz2
-rw-r--r-- 1 root root 124781044 Sep 7 14:40 www-14-39-18_07-09-2016.tar.bz2