#!/usr/bin/env bash # ============================================================ # 从服务器同步数据库到本地 # 用法: bash sync-db-from-server.sh # ============================================================ set -euo pipefail # 服务器配置(从 deploy.sh 读取) SERVER="192.168.1.10" REMOTE_DB_USER="govai" REMOTE_DB_PASS="GovAI@2024Secure" REMOTE_DB_NAME="govai_portal" # 本地数据库配置 LOCAL_DB_USER="freedak" LOCAL_DB_NAME="govai_portal" BACKUP_FILE="/tmp/govai_portal_$(date +%Y%m%d_%H%M%S).sql" GREEN='\033[0;32m' BLUE='\033[0;34m' RED='\033[0;31m' YELLOW='\033[0;33m' NC='\033[0m' log() { echo -e "${GREEN}[✓]${NC} $1"; } step() { echo -e "\n${BLUE}==== $1 ====${NC}"; } warn() { echo -e "${YELLOW}[!]${NC} $1"; } err() { echo -e "${RED}[✗]${NC} $1"; exit 1; } step "从服务器导出数据库" log "服务器: $SERVER" log "数据库: $REMOTE_DB_NAME" # 在服务器上导出数据库 ssh $SERVER "PGPASSWORD='$REMOTE_DB_PASS' pg_dump -h localhost -U $REMOTE_DB_USER -d $REMOTE_DB_NAME --clean --if-exists" > "$BACKUP_FILE" if [ ! -s "$BACKUP_FILE" ]; then err "数据库导出失败或文件为空" fi log "导出完成: $BACKUP_FILE ($(du -h "$BACKUP_FILE" | cut -f1))" step "导入到本地数据库" warn "这将清空本地数据库 $LOCAL_DB_NAME 的所有数据!" read -p "确认继续? (yes/no): " confirm if [ "$confirm" != "yes" ]; then log "取消操作" rm -f "$BACKUP_FILE" exit 0 fi # 确保本地数据库存在 log "检查本地数据库..." /Applications/Postgres.app/Contents/Versions/16/bin/psql -U $LOCAL_DB_USER -d postgres -tc "SELECT 1 FROM pg_database WHERE datname='$LOCAL_DB_NAME'" | grep -q 1 || \ /Applications/Postgres.app/Contents/Versions/16/bin/psql -U $LOCAL_DB_USER -d postgres -c "CREATE DATABASE $LOCAL_DB_NAME;" # 导入数据 log "导入数据到本地..." /Applications/Postgres.app/Contents/Versions/16/bin/psql -U $LOCAL_DB_USER -d $LOCAL_DB_NAME -f "$BACKUP_FILE" 2>&1 | tail -20 log "导入完成" # 验证数据 step "验证数据" user_count=$(/Applications/Postgres.app/Contents/Versions/16/bin/psql -U $LOCAL_DB_USER -d $LOCAL_DB_NAME -tc "SELECT COUNT(*) FROM users;") app_count=$(/Applications/Postgres.app/Contents/Versions/16/bin/psql -U $LOCAL_DB_USER -d $LOCAL_DB_NAME -tc "SELECT COUNT(*) FROM applications;") log "用户数: $(echo $user_count | xargs)" log "应用数: $(echo $app_count | xargs)" # 清理备份文件 read -p "是否删除备份文件? (yes/no): " delete_backup if [ "$delete_backup" = "yes" ]; then rm -f "$BACKUP_FILE" log "备份文件已删除" else log "备份文件保留在: $BACKUP_FILE" fi echo "" echo -e "${GREEN}════════════════════════════════════════${NC}" echo -e "${GREEN} 数据库同步完成!${NC}" echo -e "${GREEN} 本地数据库: $LOCAL_DB_NAME${NC}" echo -e "${GREEN}════════════════════════════════════════${NC}"