Files
AIclinicalresearch/docs/05-部署文档/0126部署/database-migration-script.ps1
HaHafeng 2481b786d8 deploy: Complete 0126-27 deployment - database upgrade, services update, code recovery
Major Changes:
- Database: Install pg_bigm/pgvector plugins, create test database
- Python service: v1.0 -> v1.1, add pymupdf4llm/openpyxl/pypandoc
- Node.js backend: v1.3 -> v1.7, fix pino-pretty and ES Module imports
- Frontend: v1.2 -> v1.3, skip TypeScript check for deployment
- Code recovery: Restore empty files from local backup

Technical Fixes:
- Fix pino-pretty error in production (conditional loading)
- Fix ES Module import paths (add .js extensions)
- Fix OSSAdapter TypeScript errors
- Update Prisma Schema (63 models, 16 schemas)
- Update environment variables (DATABASE_URL, EXTRACTION_SERVICE_URL, OSS)
- Remove deprecated variables (REDIS_URL, DIFY_API_URL, DIFY_API_KEY)

Documentation:
- Create 0126 deployment folder with 8 documents
- Update database development standards v2.0
- Update SAE deployment status records

Deployment Status:
- PostgreSQL: ai_clinical_research_test with plugins
- Python: v1.1 @ 172.17.173.84:8000
- Backend: v1.7 @ 172.17.173.89:3001
- Frontend: v1.3 @ 172.17.173.90:80

Tested: All services running successfully on SAE
2026-01-27 08:13:27 +08:00

248 lines
11 KiB
PowerShell
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.
# ================================================
# AI临床研究平台 - 数据库迁移脚本
# 日期: 2026-01-26
# 功能:
# 1. RDS数据库重命名 (ai_clinical_research -> ai_clinical_research_test)
# 2. 安装pg_bigm和pgvector插件
# 3. 本地数据库导出
# 4. 导入到RDS测试数据库
# ================================================
Write-Host "========================================" -ForegroundColor Green
Write-Host " AI临床研究平台 - 数据库迁移脚本" -ForegroundColor Green
Write-Host " 执行时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Green
# ============ 配置区域 ============
$RDS_HOST_EXTERNAL = "pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com" # RDS外网地址需要先开启
$RDS_HOST_INTERNAL = "pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com" # RDS内网地址
$RDS_PORT = "5432"
$RDS_USER = "airesearch"
$RDS_PASSWORD = "Xibahe@fengzhibo117"
$OLD_DB_NAME = "ai_clinical_research"
$NEW_DB_NAME = "ai_clinical_research_test"
$LOCAL_CONTAINER = "ai-clinical-postgres"
$LOCAL_USER = "postgres"
$LOCAL_DB = "ai_clinical_research"
$BACKUP_FILE = "local_db_export_$(Get-Date -Format 'yyyyMMdd_HHmmss').sql"
# ============ Step 0: 前置检查 ============
Write-Host "`n[Step 0] 前置检查..." -ForegroundColor Cyan
# 检查Docker容器
$containerStatus = docker ps --filter "name=$LOCAL_CONTAINER" --format "{{.Status}}"
if (-not $containerStatus) {
Write-Host "❌ 本地Docker容器 $LOCAL_CONTAINER 未运行!" -ForegroundColor Red
exit 1
}
Write-Host "✅ 本地Docker容器运行中: $containerStatus" -ForegroundColor Green
# ============ Step 1: 导出本地数据库 ============
Write-Host "`n[Step 1] 导出本地数据库..." -ForegroundColor Cyan
Write-Host " 文件: $BACKUP_FILE" -ForegroundColor Yellow
docker exec $LOCAL_CONTAINER pg_dump `
-U $LOCAL_USER `
-d $LOCAL_DB `
--format=plain `
--no-owner `
--no-acl `
--encoding=UTF8 `
> $BACKUP_FILE
if ($LASTEXITCODE -ne 0) {
Write-Host "❌ 数据库导出失败!" -ForegroundColor Red
exit 1
}
$fileSize = (Get-Item $BACKUP_FILE).Length / 1MB
Write-Host "✅ 数据库导出成功!文件大小: $([math]::Round($fileSize, 2)) MB" -ForegroundColor Green
# ============ Step 2: 连接RDS并重命名数据库 ============
Write-Host "`n[Step 2] 连接RDS并重命名数据库..." -ForegroundColor Cyan
Write-Host " 注意: 需要先在阿里云控制台开启RDS外网访问" -ForegroundColor Yellow
Write-Host " 外网地址: $RDS_HOST_EXTERNAL" -ForegroundColor Yellow
$env:PGPASSWORD = $RDS_PASSWORD
# 2.1 检查RDS连接
Write-Host "`n 2.1 测试RDS连接..." -ForegroundColor Yellow
$testResult = docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d postgres `
-c "SELECT version();" 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host "❌ 无法连接RDS请确保" -ForegroundColor Red
Write-Host " 1. RDS外网地址已开启" -ForegroundColor Red
Write-Host " 2. 白名单已配置 0.0.0.0/0临时" -ForegroundColor Red
Write-Host " 错误信息: $testResult" -ForegroundColor Red
exit 1
}
Write-Host "✅ RDS连接成功" -ForegroundColor Green
# 2.2 检查旧数据库是否存在
Write-Host "`n 2.2 检查数据库 $OLD_DB_NAME 是否存在..." -ForegroundColor Yellow
$dbExists = docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d postgres `
-t -c "SELECT 1 FROM pg_database WHERE datname = '$OLD_DB_NAME';"
if ($dbExists.Trim() -eq "1") {
Write-Host "✅ 数据库 $OLD_DB_NAME 存在,准备重命名..." -ForegroundColor Green
# 2.3 断开所有连接
Write-Host "`n 2.3 断开所有活动连接..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d postgres `
-c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$OLD_DB_NAME' AND pid <> pg_backend_pid();"
# 2.4 重命名数据库
Write-Host "`n 2.4 重命名数据库 $OLD_DB_NAME -> $NEW_DB_NAME ..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d postgres `
-c "ALTER DATABASE $OLD_DB_NAME RENAME TO $NEW_DB_NAME;"
if ($LASTEXITCODE -eq 0) {
Write-Host "✅ 数据库重命名成功!" -ForegroundColor Green
} else {
Write-Host "❌ 数据库重命名失败!" -ForegroundColor Red
exit 1
}
} else {
Write-Host "⚠️ 数据库 $OLD_DB_NAME 不存在,将直接创建 $NEW_DB_NAME" -ForegroundColor Yellow
}
# ============ Step 3: 创建/重建测试数据库 ============
Write-Host "`n[Step 3] 准备测试数据库 $NEW_DB_NAME ..." -ForegroundColor Cyan
# 3.1 检查测试数据库是否存在
$testDbExists = docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d postgres `
-t -c "SELECT 1 FROM pg_database WHERE datname = '$NEW_DB_NAME';"
if ($testDbExists.Trim() -eq "1") {
Write-Host " 数据库 $NEW_DB_NAME 已存在" -ForegroundColor Yellow
# 询问是否清空重建
$confirm = Read-Host " 是否删除现有数据并重新导入? (y/n)"
if ($confirm -eq "y") {
Write-Host " 断开连接并删除数据库..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d postgres `
-c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$NEW_DB_NAME';"
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d postgres `
-c "DROP DATABASE $NEW_DB_NAME;"
# 重新创建
Write-Host " 创建数据库 $NEW_DB_NAME ..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d postgres `
-c "CREATE DATABASE $NEW_DB_NAME WITH ENCODING='UTF8' LC_COLLATE='en_US.utf8' LC_CTYPE='en_US.utf8' TEMPLATE=template0;"
}
} else {
Write-Host " 创建数据库 $NEW_DB_NAME ..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d postgres `
-c "CREATE DATABASE $NEW_DB_NAME WITH ENCODING='UTF8' LC_COLLATE='en_US.utf8' LC_CTYPE='en_US.utf8' TEMPLATE=template0;"
}
Write-Host "✅ 测试数据库准备完成!" -ForegroundColor Green
# ============ Step 4: 安装PostgreSQL插件 ============
Write-Host "`n[Step 4] 安装PostgreSQL插件..." -ForegroundColor Cyan
# 4.1 安装pg_bigm
Write-Host " 4.1 安装 pg_bigm 插件..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "CREATE EXTENSION IF NOT EXISTS pg_bigm;"
# 4.2 安装pgvector
Write-Host " 4.2 安装 pgvector 插件..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "CREATE EXTENSION IF NOT EXISTS vector;"
# 4.3 验证插件安装
Write-Host "`n 4.3 验证插件安装..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "SELECT extname, extversion FROM pg_extension WHERE extname IN ('pg_bigm', 'vector');"
Write-Host "✅ 插件安装完成!" -ForegroundColor Green
# ============ Step 5: 导入数据到RDS ============
Write-Host "`n[Step 5] 导入数据到RDS测试数据库..." -ForegroundColor Cyan
Write-Host " 这可能需要几分钟,请耐心等待..." -ForegroundColor Yellow
Get-Content $BACKUP_FILE | docker exec -i -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d $NEW_DB_NAME
if ($LASTEXITCODE -eq 0) {
Write-Host "✅ 数据导入成功!" -ForegroundColor Green
} else {
Write-Host "⚠️ 数据导入过程中可能有警告,请检查日志" -ForegroundColor Yellow
}
# ============ Step 6: 验证导入结果 ============
Write-Host "`n[Step 6] 验证导入结果..." -ForegroundColor Cyan
# 6.1 检查Schema数量
Write-Host " 6.1 检查Schema列表..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "SELECT nspname FROM pg_namespace WHERE nspname LIKE '%_schema' ORDER BY nspname;"
# 6.2 检查表数量
Write-Host "`n 6.2 检查各Schema表数量..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "SELECT schemaname, COUNT(*) as table_count FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') GROUP BY schemaname ORDER BY schemaname;"
# 6.3 检查iit_schema的表
Write-Host "`n 6.3 检查 iit_schema 的表..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "SELECT tablename FROM pg_tables WHERE schemaname = 'iit_schema';"
# ============ Step 7: 提醒关闭外网访问 ============
Write-Host "`n========================================" -ForegroundColor Red
Write-Host " ⚠️ 重要安全提醒 ⚠️" -ForegroundColor Red
Write-Host "========================================" -ForegroundColor Red
Write-Host "数据库迁移完成!" -ForegroundColor Green
Write-Host ""
Write-Host "请立即执行以下安全操作:" -ForegroundColor Yellow
Write-Host "1. 登录阿里云RDS控制台" -ForegroundColor Yellow
Write-Host "2. 释放RDS外网地址" -ForegroundColor Yellow
Write-Host "3. 恢复白名单为 172.17.0.0/16移除 0.0.0.0/0" -ForegroundColor Yellow
Write-Host ""
Write-Host "新的测试数据库连接字符串(内网):" -ForegroundColor Cyan
Write-Host "DATABASE_URL=postgresql://${RDS_USER}:Xibahe%40fengzhibo117@${RDS_HOST_INTERNAL}:5432/${NEW_DB_NAME}?connection_limit=18&pool_timeout=10" -ForegroundColor Cyan
Write-Host ""
Write-Host "备份文件: $BACKUP_FILE" -ForegroundColor Yellow
Write-Host "========================================" -ForegroundColor Green