#!/bin/bash set -e # Завершить при любой ошибке # === Настройки === BACKUP_DIR="/root/backups/mysql" DATE=$(date +%Y%m%d-%H%M) LOG_FILE="$BACKUP_DIR/backup.log" # Параметры подключения к MySQL/MariaDB MYSQL_HOST="localhost" MYSQL_PORT="3306" MYSQL_USER="root" MYSQL_DB="your_database_name" # имя БД или "all" для всех # MYSQL_PASSWORD="secret" # ← раскомментируйте, если не используете .my.cnf # Создаём папку mkdir -p "$BACKUP_DIR" # Функция логирования log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE" } log "Начинаем резервное копирование MySQL..." # === Вариант 1: через временный конфиг-файл (рекомендуется) === if [[ -n "${MYSQL_PASSWORD:-}" ]]; then # Создаём временный my.cnf с правами 600 TMP_CNF="/tmp/mysql-backup.cnf.$$" trap "rm -f '$TMP_CNF'" EXIT # удалим при завершении chmod 600 "$TMP_CNF" cat > "$TMP_CNF" < "$BACKUP_FILE" else mysqldump $EXTRA_ARGS \ --single-transaction \ --routines \ --triggers \ --databases "$MYSQL_DB" \ | gzip > "$BACKUP_FILE" fi # Проверка, что файл создан и не пустой if [[ ! -s "$BACKUP_FILE" ]]; then log "Ошибка: дамп пустой или не создан!" >&2 exit 1 fi log "Дамп успешно сохранён: $BACKUP_FILE" # === Удаление старых бэкапов (>7 дней) по дате в имени === log "Удаляем бэкапы старше 7 дней..." cutoff=$(date -d '7 days ago' +%Y%m%d) for file in "$BACKUP_DIR"/mysql-*.sql.gz; do [[ -e "$file" ]] || continue basename_file=$(basename "$file") if [[ $basename_file =~ mysql-.*-([0-9]{8})-[0-9]{4}\.sql\.gz$ ]]; then file_date="${BASH_REMATCH[1]}" if [[ $file_date -lt $cutoff ]]; then log "Удаляем старый дамп: $file" rm -f "$file" fi fi done log "Резервное копирование MySQL завершено."