MySQL_dump/mysql-backup.sh

97 lines
2.9 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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" <<EOF
[client]
host=$MYSQL_HOST
port=$MYSQL_PORT
user=$MYSQL_USER
password=$MYSQL_PASSWORD
EOF
EXTRA_ARGS="--defaults-file=$TMP_CNF"
else
# Предполагается, что ~/.my.cnf настроен
EXTRA_ARGS=""
fi
# === Имя файла бэкапа ===
if [[ "$MYSQL_DB" == "all" ]]; then
BACKUP_FILE="$BACKUP_DIR/mysql-all-$DATE.sql.gz"
else
BACKUP_FILE="$BACKUP_DIR/mysql-${MYSQL_DB}-$DATE.sql.gz"
fi
# === Создание дампа ===
log "Создаём дамп базы данных: $MYSQL_DB..."
if [[ "$MYSQL_DB" == "all" ]]; then
mysqldump $EXTRA_ARGS \
--single-transaction \
--routines \
--triggers \
--events \
--all-databases \
| gzip > "$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 завершено."