Добавить mysql-backup.sh
This commit is contained in:
commit
a898a692af
97
mysql-backup.sh
Normal file
97
mysql-backup.sh
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#!/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 завершено."
|
||||||
Loading…
Reference in New Issue
Block a user