Lab / VPS / Bash / DevOPS

Bash: Автоматический Backup для баз данных MySQL на сервере Ubuntu

Ранее я уже писал как настроить бекап файлов на вашем vps теперь пришло время сделать то-же самое для баз данных. Давайте обойдёмся без долгих вступлений и перейдём прямо к делу.

Обратите внимание, для того, что бы автоматизировать сохранение всех баз вам нужен MySQL супер юзер с привилегиями чтения всех баз данных. Давайте создадим его, только замените dbadminpasswd на ваш более безопасный пароль:

CREATE USER 'dbadmin'@'localhost' IDENTIFIED BY 'dbadminpasswd';

А теперь давайте зададим этому пользователю права на все базы данных

GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'localhost';

Если у вас уже создана папка /scripts из прошлого урока, просто перейдите в неё и создайте новый файл

cd /scripts
touch dbackup.sh

Вот мой пример скрипта автоматического бекапа MySQL

USER — Супер пользователь с правами чтения всех баз PASSWORD — Пароль пользователя MySQL DAYS_TO_KEEP — За сколько дней храним бекапы если 0 то храним всегда GZIP — Сжимаем файлы 1 — да, 0 — нет BACKUP_PATH — папка в которую складываем бекапы

#!/bin/bash
#----------------------------------------
# OPTIONS
#----------------------------------------
USER='dbadmin'
PASSWORD='dbadminpasswd'
DAYS_TO_KEEP=7    # 0 to keep forever
GZIP=1            # 1 = Compress
BACKUP_PATH='/backups/mysql'
#----------------------------------------

# Create the backup folder
if [ ! -d $BACKUP_PATH ]; then
  mkdir -p $BACKUP_PATH
fi

# Get list of database names
databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "|" | grep -v Database`

for db in $databases; do

  if [ $db == 'information_schema' ] || [ $db == 'performance_schema' ] || [ $db == 'mysql' ] || [ $db == 'sys' ]; then
    echo "Skipping database: $db"
    continue
  fi
  
  date=$(date -I)
  if [ "$GZIP" -eq 0 ] ; then
    echo "Backing up database: $db without compression"      
    mysqldump -u $USER -p$PASSWORD --databases $db > $BACKUP_PATH/$date-$db.sql
  else
    echo "Backing up database: $db with compression"
    mysqldump -u $USER -p$PASSWORD --databases $db | gzip -c > $BACKUP_PATH/$date-$db.gz
  fi
done

# Delete old backups
if [ "$DAYS_TO_KEEP" -gt 0 ] ; then
  echo "Deleting backups older than $DAYS_TO_KEEP days"
  find $BACKUP_PATH/* -mtime +$DAYS_TO_KEEP -exec rm {} \;
fi

Давайте сделаем этот файл исполняемым:

sudo chmod +x dbackup.sh

Запустим вручную:

sudo ./dbackup.sh

и наконец для автоматизации добавим задание в таблицу крона:

sudo crontab -e

добавляем строку:

@daily sh /scripts/mysql-backup.sh >> /var/log/mysql-backup.log 2>&1

Вот и вся магия, теперь у вас есть автоматический бекап вашей базы данных =)