Post icon

Автоматические бэкапы файлов и баз данных в Linux

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

Создаём нового MySQL пользователя

Этот блок можете пропустить, если вам нужно делать бекапы только директорий.

Заходим в mysql, создаём пользователя backup_user, а затем выдадим ему необходимые права. Вместо your_strong_password вводим новый пароль для юзера.

sudo mysql
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT SELECT, LOCK TABLES ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;

Создаём Bash скрипт

Для создания скрипта воспользуемся текстовым редактором nano. Выполните команду:

sudo nano /root/backup_script.sh

BACKUP_BASE_DIR – директория, куда сохранять бекапы.
DB_USER – имя нового пользователя бд.
DB_PASSWORD – пароль нового пользователя бд
SOURCE_DIRS – пути до того, что бекапим.
EXCLUDE_PATHS – пути до того, что не нужно бекапить.
RETENTION_DAYS – через сколько дней удалять старые бекапы.

Теперь вставьте следующий код в файл скрипта:

#!/bin/bash

# Settings
BACKUP_BASE_DIR="/var/www/backups"
DB_USER="backup_user"
DB_PASSWORD="hypLmT7An6mqjGuPKdtB"
SOURCE_DIRS="/var/www/cpmdealercom" # Paths to be backed up
EXCLUDE_PATHS="" # Add paths to exclude in quotes: /var/www/test/123 /var/www/test/abc /var/www/test2/123.txt
RETENTION_DAYS=7

# Date and time
DATE=$(date +%Y-%m-%d)
BACKUP_DIR="$BACKUP_BASE_DIR/$DATE"

# Create directory if it does not exist
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
fi

# Database backup
databases=$(mysql -u"${DB_USER}" -p"${DB_PASSWORD}" -e "SHOW DATABASES;" | grep -v Database | grep -vE 'information_schema|performance_schema|mysql|sys')
for db in $databases; do
    mysqldump -u"${DB_USER}" -p"${DB_PASSWORD}" "$db" | gzip > "$BACKUP_DIR/${db}_${DATE}.sql.gz"
done

# File backup
for dir in $SOURCE_DIRS; do
    dir_name=$(basename "$dir")

    # Create exclude options string for tar
    exclude_options=""
    for exclude_path in $EXCLUDE_PATHS; do
        if [[ "$exclude_path" == "$dir"* ]]; then
            echo "Excluding: $exclude_path from $dir" # Debug output
            exclude_options+=" --exclude=$exclude_path"  # Remove single quotes
        else
            echo "Not excluding: $exclude_path from $dir" # Debug output
        fi
    done

    # Use exclude options in tar
    tar -czvf "$BACKUP_DIR/${dir_name}_${DATE}.tar.gz" $exclude_options "$dir"
done

# Delete old backups (removes directories)
find "$BACKUP_BASE_DIR/" -maxdepth 1 -type d -mtime +"${RETENTION_DAYS}" -exec rm -rf {} \;

echo "Backup completed. Directory: $BACKUP_DIR"

В редакторе nano нажмите Ctrl + X, затем Y (для сохранения) и Enter для выхода (одинаково для Windows и Mac).

Теперь нужно сделать файл скрипта исполняемым. Выполните команду:

sudo chmod +x /root/backup_script.sh

Тестируем и автоматизируем скрипт

Для тестирования бэкапа можно запустить скрипт вручную. Это запустит процесс бэкапа файлов и базы данных.

sudo /root/backup_script.sh

После выполнения скрипта проверьте директорию, которую вы указывали в баш скрипте BACKUP_BASE_DIR на наличие созданного архива.

Чтобы автоматизировать процесс бэкапа, используем планировщик задач cron. Он позволяет запускать скрипт по расписанию. Выполните команду:

crontab -e

Добавьте строку для выполнения скрипта каждый день в 4:00 утра:

0 4 * * * /root/backup_script.sh
  • 0 — это минуты (ровно в начале часа),
  • 4 — это час (4:00 утра),
  • * * * — это день месяца, месяц и день недели (означает, что задание выполняется каждый день).

Сохраните файл и выйдите из редактора cron (как из nano). Теперь скрипт будет автоматически запускаться каждый день в 4:00 утра.

Чтобы убедиться, что задание добавлено в cron, выполните команду:

crontab -l

Эта команда выведет список всех запланированных задач cron для текущего пользователя.


To top