Бэкап базы данных Mysql на Amazon S3

20 Mar 2020

Всем привет! Сегодня хотел бы поделиться рецептом автоматического бэкапа баз данных Mysql на Amazon S3.

Помимо облачного хранилища, бэкапы сохраняются локально на сервере. Все действия проводились на Ubuntu Server 18.04.

Сначала нужно добавить ключи доступа для Amazon S3 по инструкции: https://aws.amazon.com/ru/getting-started/tutorials/backup-to-s3-cli/

А также создать отдельный bucket my_website_backups для бэкапов: https://docs.aws.amazon.com/quickstarts/latest/s3backup/step-1-create-bucket.html

Затем установим консольный клиент для Amazon. В процессе установки нужно будет указать ключи доступа, полученные на предыдущем шаге.

sudo apt-get install -y python-pip
sudo pip install awscli
aws configure

Затем создадим отдельного пользователя для создания бэкапов. Для этого нужно выполнить SQL запросы:

CREATE USER 'backup'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'backup'@'localhost';

Возможно, стоит задать более строгие права доступа для пользователя backup. К примеру, только чтение.

Далее создадим папку для сохранения бэкапов локально

mkdir -p /var/backups/databases/my_website_backups

Теперь, когда все готово, можем создать скрипт для создания бэкапов и сделаем его исполняемым:

touch /opt/databases_backup.sh
chmod +x /opt/databases_backup.sh
nano /opt/databases_backup.sh

Сам скрипт:

#! /bin/bash

 TIMESTAMP=$(date +"%F-%T")
 BACKUP_DIR="/var/backups/databases/scitourn/$TIMESTAMP"
 MYSQL_USER="backup"
 MYSQL=/usr/bin/mysql
 MYSQL_PASSWORD="password"
 MYSQL_HOST="localhost"
 AWS=/usr/local/bin/aws

 MYSQLDUMP=/usr/bin/mysqldump databases=`$MYSQL --user=$MYSQL_USER -h$MYSQL_HOST -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)"`
 mkdir -p "$BACKUP_DIR"

 for db in $databases; do
   echo $db
   time $MYSQLDUMP -Qc --add-drop-table --single-transaction --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/$db.gz"
 done
 $AWS s3 cp $BACKUP_DIR s3://my_website_backups/databases/production/$TIMESTAMP --recursive
#rm -rf /var/backups/databases/my_website_backups/*

Скрипт довольно простой. Сначала задаются значения всех необходимых переменных. Данные пользователя Mysql, путь к временной папке сохранения бэкапов, глобальные пути к утилитам.

Затем получаем список всех баз данных, кроме служебных. С помощью mysqldump, в цикле делаем дампы всех баз данных и архивируем. Полученные файлы загружаем на amazon s3, в отдельную директорию. Затем бэкапы из временной директории можно удалить. Либо оставить в качестве дополнительных бэкапов.

Проверим работу скрипта. В результате на amazon s3 должна повиться новая директория с бэкапами.

/opt/databases_backup.sh

И, если все работает корректно, можно добавить скрипт в cron.

crontab -e

Будем запускать скрипт каждые 2 часа. Можно запускать реже либо чаще.

0 */2 * * *  /opt/databases_backup.sh

На этом пока все. Спасибо за внимание!