56 lines
1.7 KiB
Bash
Executable File
56 lines
1.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# ===========================================
|
|
# 数据库备份脚本
|
|
# 用途: 备份 PostgreSQL 数据库到本地文件
|
|
# 建议: 每天通过 cron 执行一次
|
|
# Crontab 示例:
|
|
# 0 4 * * * /root/rust/rust_backend/scripts/backup-db.sh >> /root/rust/rust_backend/logs/backup.log 2>&1
|
|
# ===========================================
|
|
|
|
set -euo pipefail
|
|
|
|
DB_CONTAINER="1Panel-postgresql-FtMo"
|
|
DB_NAME="${1:-milkydata}"
|
|
DB_USER="milkydata"
|
|
BACKUP_DIR="/root/rust/rust_backend/backups"
|
|
RETENTION_DAYS=7
|
|
|
|
LOG_PREFIX="[$(date '+%Y-%m-%d %H:%M:%S')]"
|
|
|
|
echo "$LOG_PREFIX 开始备份数据库: ${DB_NAME}"
|
|
|
|
# 确保备份目录存在
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
# 检查容器是否运行
|
|
if ! docker ps --format '{{.Names}}' | grep -q "^${DB_CONTAINER}$"; then
|
|
echo "$LOG_PREFIX 错误: Docker 容器 ${DB_CONTAINER} 未运行"
|
|
exit 1
|
|
fi
|
|
|
|
# 执行备份(自定义格式,可压缩)
|
|
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_$(date +%Y%m%d_%H%M%S).dump"
|
|
|
|
echo "$LOG_PREFIX 导出到: ${BACKUP_FILE}"
|
|
docker exec "$DB_CONTAINER" pg_dump -U "$DB_USER" -Fc "$DB_NAME" > "$BACKUP_FILE"
|
|
|
|
# 检查备份是否成功
|
|
if [ -f "$BACKUP_FILE" ] && [ -s "$BACKUP_FILE" ]; then
|
|
FILE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
|
|
echo "$LOG_PREFIX 备份成功: ${BACKUP_FILE} (${FILE_SIZE})"
|
|
else
|
|
echo "$LOG_PREFIX 错误: 备份文件为空或不存在"
|
|
exit 1
|
|
fi
|
|
|
|
# 删除旧备份(保留 RETENTION_DAYS 天)
|
|
echo "$LOG_PREFIX 清理 ${RETENTION_DAYS} 天前的旧备份..."
|
|
find "$BACKUP_DIR" -name "${DB_NAME}_*.dump" -mtime "+${RETENTION_DAYS}" -delete
|
|
|
|
# 记录保留的备份
|
|
echo "$LOG_PREFIX 当前备份列表:"
|
|
ls -lh "$BACKUP_DIR"/*.dump 2>/dev/null || echo " (无备份文件)"
|
|
|
|
echo "$LOG_PREFIX 备份完成"
|