20 мар. 2020 г.
Всем привет! Сегодня хотел бы поделиться рецептом автоматического бэкапа баз данных Mysql на Amazon S3.
Помимо облачного хранилища, бэкапы сохраняются локально на сервере. Все действия проводились на Ubuntu Server 20.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 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
Теперь, когда все готово, можем создать скрипт для создания бэкапов и сделаем его исполняемым:
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/$TIMESTAMP"
MYSQL_USER="backup"
MYSQL=/usr/bin/mysql
MYSQL_PASSWORD="password"
MYSQL_HOST="localhost"
AWS=/usr/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/$TIMESTAMP --recursive
#rm -rf /var/backups/databases/*
Скрипт довольно простой. Сначала задаются значения всех необходимых переменных. Данные пользователя Mysql, путь к временной папке сохранения бэкапов, глобальные пути к утилитам.
Затем получаем список всех баз данных, кроме служебных. С помощью mysqldump, в цикле делаем дампы всех баз данных и архивируем. Полученные файлы загружаем на amazon s3, в отдельную директорию. Затем бэкапы из временной директории можно удалить. Либо оставить в качестве дополнительных бэкапов.
Проверим работу скрипта. В результате на amazon s3 должна повиться новая директория с бэкапами.
/opt/databases_backup.sh
И, если все работает корректно, можно добавить скрипт в cron.
crontab -e
Будем запускать скрипт каждые 2 часа. Можно запускать реже либо чаще.
0 */2 * * * /opt/databases_backup.sh
Код также доступен на gist. На этом пока все. Спасибо за внимание!