Создаём нового 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 для текущего пользователя.