Files
java-template/client-deployment/restore-database.sh
T
2025-08-14 08:11:03 +08:00

113 lines
3.6 KiB
Bash
Executable File

#!/bin/bash
# -*- coding: utf-8 -*-
# 数据库恢复脚本
set -e # 遇到错误立即退出
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 日志函数
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 配置
MYSQL_CONTAINER="ljwx-mysql"
MYSQL_USER="root"
MYSQL_PASSWORD="123456"
MYSQL_DATABASE="ljwx"
BACKUP_DIR="backup/mysql"
RESTORE_LOG="logs/restore_$(date +%Y%m%d_%H%M%S).log"
# 创建日志目录
mkdir -p logs
# 检查参数
if [ $# -eq 0 ]; then
# 自动选择最新备份
BACKUP_FILE=$(ls -t $BACKUP_DIR/*.sql 2>/dev/null | head -1)
if [ -z "$BACKUP_FILE" ]; then
log_error "未找到备份文件,请指定备份文件路径"
echo "用法: $0 [backup_file.sql]"
exit 1
fi
log_info "自动选择最新备份: $BACKUP_FILE"
else
BACKUP_FILE="$1"
if [ ! -f "$BACKUP_FILE" ]; then
log_error "备份文件不存在: $BACKUP_FILE"
exit 1
fi
fi
log_info "开始数据库恢复流程..."
# 检查MySQL容器状态
if ! docker ps | grep -q $MYSQL_CONTAINER; then
log_error "MySQL容器未运行,请先启动服务"
exit 1
fi
# 等待MySQL服务就绪
log_info "等待MySQL服务就绪..."
for i in {1..30}; do
if docker exec $MYSQL_CONTAINER mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT 1" >/dev/null 2>&1; then
log_info "MySQL服务已就绪"
break
fi
if [ $i -eq 30 ]; then
log_error "MySQL服务启动超时"
exit 1
fi
sleep 2
done
# 创建数据库备份(恢复前备份)
CURRENT_BACKUP="backup/mysql/pre_restore_$(date +%Y%m%d_%H%M%S).sql"
log_info "创建恢复前备份: $CURRENT_BACKUP"
docker exec $MYSQL_CONTAINER mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD --single-transaction $MYSQL_DATABASE > $CURRENT_BACKUP
# 执行数据恢复
log_info "正在恢复数据库: $BACKUP_FILE"
{
echo "恢复开始时间: $(date)"
echo "备份文件: $BACKUP_FILE"
echo "目标数据库: $MYSQL_DATABASE"
echo "----------------------------------------"
} >> $RESTORE_LOG
if docker exec -i $MYSQL_CONTAINER mysql -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE < $BACKUP_FILE 2>> $RESTORE_LOG; then
log_info "数据库恢复成功"
# 验证恢复结果
log_info "验证恢复结果..."
USER_COUNT=$(docker exec $MYSQL_CONTAINER mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "USE $MYSQL_DATABASE; SELECT COUNT(*) FROM t_user_info;" -N 2>/dev/null || echo "0")
DEVICE_COUNT=$(docker exec $MYSQL_CONTAINER mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "USE $MYSQL_DATABASE; SELECT COUNT(*) FROM t_device_info;" -N 2>/dev/null || echo "0")
HEALTH_COUNT=$(docker exec $MYSQL_CONTAINER mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "USE $MYSQL_DATABASE; SELECT COUNT(*) FROM t_health_data;" -N 2>/dev/null || echo "0")
log_info "恢复统计:"
log_info " 用户数据: $USER_COUNT 条"
log_info " 设备数据: $DEVICE_COUNT 条"
log_info " 健康数据: $HEALTH_COUNT 条"
{
echo "恢复完成时间: $(date)"
echo "恢复统计: 用户=$USER_COUNT, 设备=$DEVICE_COUNT, 健康=$HEALTH_COUNT"
echo "----------------------------------------"
} >> $RESTORE_LOG
log_info "恢复日志保存至: $RESTORE_LOG"
log_info "恢复前备份保存至: $CURRENT_BACKUP"
else
log_error "数据库恢复失败,详见日志: $RESTORE_LOG"
log_warn "可使用恢复前备份回滚: $CURRENT_BACKUP"
exit 1
fi
log_info "数据库恢复完成!"