Files
AIclinicalresearch/docs/05-部署文档/08-PostgreSQL数据库部署操作手册.md
HaHafeng dac3cecf78 feat(iit): Complete IIT Manager Agent Day 1 - Environment initialization and WeChat integration
Summary:
- Complete IIT Manager Agent MVP Day 1 (12.5% progress)
- Database: Create iit_schema with 5 tables (IitProject, IitPendingAction, IitTaskRun, IitUserMapping, IitAuditLog)
- Backend: Add module structure (577 lines) and types (223 lines)
- WeChat: Configure Enterprise WeChat app (CorpID, AgentID, Secret)
- WeChat: Obtain web authorization and JS-SDK authorization
- WeChat: Configure trusted domain (iit.xunzhengyixue.com)
- Frontend: Deploy v1.2 with WeChat domain verification file
- Frontend: Fix CRLF issue in docker-entrypoint.sh (CRLF -> LF)
- Testing: 11/11 database CRUD tests passed
- Testing: Access Token retrieval test passed
- Docs: Create module status and development guide
- Docs: Update MVP task list with Day 1 completion
- Docs: Rename deployment doc to SAE real-time status record
- Deployment: Update frontend internal IP to 172.17.173.80

Technical Details:
- Prisma: Multi-schema support (iit_schema)
- pg-boss: Job queue integration prepared
- Taro 4.x: Framework selected for WeChat Mini Program
- Shadow State: Architecture foundation laid
- Docker: Fix entrypoint script line endings for Linux container

Status: Day 1/14 complete, ready for Day 2 REDCap integration
2026-01-01 14:32:58 +08:00

26 KiB
Raw Blame History

PostgreSQL 15 数据库部署操作手册

文档版本: v1.0
创建时间: 2025-12-24
适用场景: 本地PostgreSQL数据库迁移到阿里云RDS
数据库版本: PostgreSQL 15
部署方式: pg_dump全量导入
预计时间: 30分钟


📋 目录

  1. 部署概述
  2. 前置条件检查
  3. 部署步骤
  4. 验证测试
  5. 安全加固
  6. 常见问题
  7. 回滚方案
  8. 最佳实践

1. 部署概述

1.1 部署目标

目标: 将本地Docker PostgreSQL数据库完整迁移到阿里云RDS PostgreSQL 15

方法: pg_dump全量导出 + psql导入

优势:
  ✅ 100%完整(结构+数据+索引+外键)
  ✅ 一次性完成
  ✅ 可重复执行
  ✅ 简单可靠
  ✅ 包含pg-boss表不需要单独处理

1.2 部署架构

本地环境                              阿里云RDS
┌─────────────────┐                  ┌─────────────────┐
│                 │                  │                 │
│  Docker         │  pg_dump导出     │  RDS PostgreSQL │
│  PostgreSQL 15  │ ────────────────>│  15.14          │
│                 │  psql导入        │                 │
│  26 MB数据      │                  │  VPC内网        │
│  10个Schema     │                  │  2核4GB         │
│  34个表         │                  │  50GB存储       │
└─────────────────┘                  └─────────────────┘

1.3 数据库信息

本地数据库

容器名称: ai-clinical-postgres
镜像: postgres:15-alpine
数据库名: ai_clinical_research
用户名: postgres
密码: postgres
端口: 5432
数据大小: 约26 MB

RDS数据库

实例ID: pgm-2zex1m2y3r23hdn5
内网地址: pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432
数据库名: ai_clinical_research
用户名: airesearch
密码: Xibahe@fengzhibo117
版本: PostgreSQL 15.14
规格: 2核4GB
存储: 50GB SSD
地域: 华北2北京
VPC: vpc-2ze055cptkew9c38w4r06 (172.17.0.0/16)
白名单: 172.17.0.0/16VPC网段
时区: Asia/Shanghai

2. 前置条件检查

2.1 本地环境检查

# 1. 检查Docker是否运行
docker --version

# 2. 检查PostgreSQL容器状态
docker ps --filter "name=ai-clinical-postgres"
# 预期输出: 容器状态为 Up健康状态为 healthy

# 3. 验证本地数据库连接
docker exec ai-clinical-postgres psql -U postgres -d ai_clinical_research -c "SELECT version();"
# 预期输出: PostgreSQL 15.x

# 4. 检查数据库大小
docker exec ai-clinical-postgres psql -U postgres -d ai_clinical_research -c "SELECT pg_size_pretty(pg_database_size('ai_clinical_research'));"
# 预期输出: 约26 MB

2.2 RDS环境检查

☑️ RDS实例已创建且运行中
☑️ VPC和交换机已配置
☑️ 白名单已配置: 172.17.0.0/16
☑️ 时区已设置: Asia/Shanghai
☑️ 数据库用户已创建: airesearch
☑️ 数据库密码已记录: Xibahe@fengzhibo117

2.3 网络连接检查

方案A: 有ECS跳板机
  - 准备ECS公网IP
  - 准备SSH密钥或密码
  - 确保ECS在同一VPC

方案B: 临时外网访问(本文档采用)
  - 需要临时开启RDS外网地址
  - 需要配置白名单临时使用0.0.0.0/0
  - ⚠️ 完成后立即关闭外网访问

3. 部署步骤

步骤1: 导出本地数据库5分钟

1.1 导出数据库

# 在项目根目录执行
cd D:\MyCursor\AIclinicalresearch

# 导出完整数据库(包括结构、数据、索引、外键)
docker exec ai-clinical-postgres pg_dump `
  -U postgres `
  -d ai_clinical_research `
  --format=plain `
  --no-owner `
  --no-acl `
  --encoding=UTF8 `
  > "rds_init_$(Get-Date -Format 'yyyyMMdd_HHmmss').sql"

参数说明:

-U postgres: 使用postgres用户
-d ai_clinical_research: 指定数据库名
--format=plain: 纯文本SQL格式
--no-owner: 不导出所有者信息(避免用户名冲突)
--no-acl: 不导出权限信息使用RDS默认权限
--encoding=UTF8: UTF-8编码中文支持

1.2 验证导出文件

# 检查文件大小和创建时间
Get-ChildItem rds_init_*.sql | 
  Sort-Object LastWriteTime -Descending | 
  Select-Object -First 1 | 
  Format-Table Name, @{Name="Size(MB)";Expression={[math]::Round($_.Length/1MB,2)}}, LastWriteTime -AutoSize

预期结果:

Name                         Size(MB) LastWriteTime      
----                         -------- -------------      
rds_init_20251224_154529.sql 88.23    2025/12/24 15:45:30

检查要点:

✅ 文件大小合理50-100 MB
✅ 文件创建时间为刚才
✅ 文件名包含时间戳

步骤2: 开启RDS外网访问3分钟

⚠️ 重要安全提示: 此步骤会临时开放数据库的公网访问,存在安全风险。必须在导入完成后立即关闭!

2.1 登录RDS控制台

访问: https://rdsnext.console.aliyun.com/
地域: 华北2北京

2.2 申请外网地址

  1. 找到实例:pgm-2zex1m2y3r23hdn5
  2. 点击实例ID进入实例详情
  3. 左侧菜单:数据库连接申请外网地址
  4. 端口:5432(默认)
  5. 点击 确定
  6. 等待30-60秒外网地址生成

生成的外网地址示例:

pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com

⚠️ 记录此地址,后续步骤需要使用!

2.3 配置白名单

阿里云会弹窗询问:

是否将 0.0.0.0/0 加入白名单?

选择:点击「是」

风险说明:

风险: 全世界任何人都可以尝试连接你的RDS

缓解措施:
  ✅ 密码强度高Xibahe@fengzhibo117
  ✅ 仅用10分钟完成导入
  ✅ 导入后立即关闭外网访问
  ✅ 实际暴露时间极短

可接受性: ✅ 临时调试,可接受

步骤3: 创建数据库1分钟

3.1 连接到RDS

# 测试连接连接到默认postgres数据库
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d postgres `
  -c "SELECT version();"

预期输出:

                          version                          
------------------------------------------------------------
 PostgreSQL 15.14 on x86_64-pc-linux-gnu, compiled by gcc
(1 row)

3.2 创建数据库

# 创建ai_clinical_research数据库
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d postgres `
  -c "CREATE DATABASE ai_clinical_research WITH ENCODING='UTF8' LC_COLLATE='en_US.utf8' LC_CTYPE='en_US.utf8' TEMPLATE=template0;"

预期输出:

CREATE DATABASE

3.3 验证数据库创建

# 验证数据库存在
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d postgres `
  -c "\l ai_clinical_research"

步骤4: 导入数据到RDS5-8分钟

这是最关键的步骤,请耐心等待!

4.1 执行导入

# 通过管道将SQL文件导入RDS
$env:PGPASSWORD="Xibahe@fengzhibo117"
Get-Content "rds_init_20251224_154529.sql" | `
  docker exec -i -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
    -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
    -p 5432 `
    -U airesearch `
    -d ai_clinical_research

注意: 请将文件名 rds_init_20251224_154529.sql 替换为实际导出的文件名。

4.2 导入过程输出示例

SET
SET
CREATE SCHEMA
CREATE SCHEMA
...(中间省略数百行)...
CREATE TABLE
CREATE TABLE
COPY 1204  ← 导入1204行数据
COPY 783
COPY 3
...
CREATE INDEX
CREATE INDEX
ALTER TABLE
...

导入时间估算:

文件大小: 88 MB
预计时间: 5-8 分钟
取决于: 网络带宽和RDS写入速度

进度指示:
  - 看到 CREATE SCHEMA → Schema创建中
  - 看到 CREATE TABLE → 表创建中
  - 看到 COPY 数字 → 数据导入中(数字是行数)
  - 看到 CREATE INDEX → 索引创建中
  - 看到 ALTER TABLE → 外键创建中

4.3 导入完成标志

当命令执行完成返回提示符时,说明导入完成。


步骤5: 验证导入结果3分钟

5.1 验证Schema

# 检查Schema数量
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d ai_clinical_research `
  -c "SELECT nspname FROM pg_namespace WHERE nspname LIKE '%_schema' ORDER BY nspname;"

预期输出:

      nspname       
--------------------
 admin_schema
 aia_schema
 asl_schema
 common_schema
 dc_schema
 pkb_schema
 platform_schema
 rvw_schema
 ssa_schema
 st_schema
(10 rows)

应该看到10个Schema

5.2 验证表数量

# 检查每个Schema的表数量
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d ai_clinical_research `
  -c "SELECT schemaname, COUNT(*) as table_count FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') GROUP BY schemaname ORDER BY schemaname;"

预期输出:

   schemaname    | table_count 
-----------------+-------------
 aia_schema      |           5
 asl_schema      |           6
 dc_schema       |           6
 pkb_schema      |           5
 platform_schema |           8
 public          |           4
(6 rows)

总计34个表

5.3 验证pg-boss表关键

# 检查pg-boss的6个表是否存在
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d ai_clinical_research `
  -c "SELECT tablename FROM pg_tables WHERE schemaname = 'platform_schema' AND tablename IN ('job', 'queue', 'schedule', 'subscription', 'job_common', 'version') ORDER BY tablename;"

预期输出:

  tablename   
--------------
 job
 job_common
 queue
 schedule
 subscription
 version
(6 rows)

pg-boss的6个表全部存在

说明:

pg-boss表的作用:
  - job: 任务队列表
  - queue: 队列配置表
  - schedule: 定时任务表
  - subscription: 订阅表
  - job_common: 任务通用配置表
  - version: pg-boss版本表

为什么重要:
  - backend应用依赖pg-boss进行异步任务处理
  - 如果这些表不存在backend启动会失败
  - 通过pg_dump导入这些表会自动包含
  - 不需要在Prisma Schema中定义

5.4 验证数据量

# 检查关键表的数据量
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d ai_clinical_research `
  -c "SELECT COUNT(*) as user_count, 'platform_schema.users' as table_name FROM platform_schema.users UNION ALL SELECT COUNT(*), 'aia_schema.projects' FROM aia_schema.projects UNION ALL SELECT COUNT(*), 'asl_schema.literatures' FROM asl_schema.literatures;"

预期输出示例:

 user_count |       table_name       
------------+------------------------
          3 | platform_schema.users
          2 | aia_schema.projects
       1204 | asl_schema.literatures
(3 rows)

数据量与本地一致

5.5 验证索引和外键

# 检查索引数量
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d ai_clinical_research `
  -c "SELECT schemaname, COUNT(*) as index_count FROM pg_indexes WHERE schemaname NOT IN ('pg_catalog', 'information_schema') GROUP BY schemaname ORDER BY schemaname;"
# 检查外键约束数量
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d ai_clinical_research `
  -c "SELECT COUNT(*) as fk_count FROM pg_constraint WHERE contype = 'f';"

步骤6: 关闭外网访问2分钟

⚠️ 这是最重要的安全步骤,必须立即执行!

6.1 释放外网地址

  1. 回到RDS控制台

    • 实例详情页面
  2. 找到「数据库连接」

  3. 找到外网地址

    pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com
    
  4. 点击「释放外网地址」

  5. 在确认对话框中点击「确定」

  6. 等待几秒钟

  7. 确认状态变为「未申请」

6.2 验证外网访问已关闭

# 尝试从本地连接外网地址(应该失败)
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d ai_clinical_research `
  -c "SELECT 1;" `
  --connect-timeout=5

# 预期结果: 连接超时或连接失败

预期错误:

psql: error: connection timed out

这个错误说明外网访问已成功关闭!

6.3 最终安全状态

RDS连接配置:
  内网地址: pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com ✅ (保留)
  外网地址: 已删除 ✅
  白名单: 172.17.0.0/16 (VPC网段) ✅
  
安全状态:
  ✅ 外网无法访问
  ✅ 只有VPC内的SAE应用可以连接
  ✅ 安全风险已消除
  ✅ 数据库处于最安全状态

4. 验证测试

4.1 本地应用连接测试(可选)

如果需要本地测试连接RDS需要建立SSH隧道

# 前提: 需要有ECS跳板机

# 建立SSH隧道
ssh -N -L 5433:pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432 root@ECS公网IP

# 在另一个终端测试连接
$env:PGPASSWORD="Xibahe@fengzhibo117"
psql -h localhost -p 5433 -U airesearch -d ai_clinical_research -c "SELECT version();"

4.2 配置backend连接RDS

# backend/.env
DATABASE_URL=postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=10&pool_timeout=10&connect_timeout=10

# ⚠️ 注意: 密码中的 @ 符号必须转义为 %40

URL编码规则

特殊字符转义:
  @ -> %40
  # -> %23
  $ -> %24
  % -> %25
  & -> %26
  + -> %2B
  空格 -> %20

4.3 backend启动测试

cd backend
npm run dev

# 预期日志:
# ✅ 数据库连接成功
# ✅ pg-boss started
# ✅ Server listening on 0.0.0.0:3001

5. 安全加固

5.1 密码安全

当前密码: Xibahe@fengzhibo117

强度评估:
  ✅ 长度: 21个字符
  ✅ 大写字母: Xibahe, X, S
  ✅ 小写字母: ibahe, fengzhibo
  ✅ 数字: 117
  ✅ 特殊符号: @
  ✅ 强度: 

建议:
  - 定期轮换密码每3-6个月
  - 不要在代码中硬编码密码
  - 只在SAE环境变量中配置
  - 不要提交到Git仓库

5.2 白名单配置

当前配置: 172.17.0.0/16 (VPC网段)

最佳实践:
  ✅ 使用VPC网段不用单机IP
  ✅ SAE实例IP会变化单机IP会导致连接失败
  ❌ 不要配置 0.0.0.0/0全网开放
  ❌ 不要配置多个单机IP维护困难

验证:
  - RDS控制台 > 数据安全性 > 白名单设置
  - 确认只有 172.17.0.0/16
  - 确认没有 0.0.0.0/0

5.3 访问控制

用户权限:
  airesearch: 应用专用用户
    - 权限: SELECT, INSERT, UPDATE, DELETE
    - 不要用超级用户 postgres
    - 最小权限原则

连接限制:
  - 配置 connection_limit=10每个SAE实例
  - 避免连接池耗尽
  - RDS最大连接数: 400

5.4 备份策略

RDS自动备份强制开启:
  数据备份: 每天一次
  日志备份: 实时PITR支持
  保留时间: 7天免费
  备份时间: 凌晨2:00-4:00

手动快照(重要操作前):
  - Schema变更前
  - 大版本升级前
  - 删除大量数据前
  - 保留30-60天

恢复能力:
  ✅ 时间点恢复PITR
  ✅ 可恢复到任意秒
  ✅ 备份存储在OSS

6. 常见问题

问题1: 导出时提示权限不足

症状:

pg_dump: error: permission denied for table xxx

原因: 使用的用户没有足够权限

解决:

# 使用超级用户postgres
docker exec ai-clinical-postgres pg_dump -U postgres -d ai_clinical_research ...

# 而不是普通用户

问题2: 导入时连接超时

症状:

psql: error: connection timed out

原因:

  1. 外网地址未开启
  2. 白名单未配置
  3. 网络问题

排查步骤:

# 1. 确认外网地址已开启
# RDS控制台 > 数据库连接 > 查看外网地址

# 2. 确认白名单配置
# RDS控制台 > 数据安全性 > 白名单设置
# 应该包含 0.0.0.0/0临时或你的公网IP

# 3. 测试网络连通性
ping pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com

# 4. 测试端口连通性
Test-NetConnection -ComputerName pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com -Port 5432

问题3: 导入时提示数据库不存在

症状:

psql: error: database "ai_clinical_research" does not exist

原因: 忘记创建数据库

解决:

# 先创建数据库
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d postgres `
  -c "CREATE DATABASE ai_clinical_research WITH ENCODING='UTF8';"

# 然后再导入

问题4: 导入后pg-boss表缺失

症状:

backend启动日志显示:
Error: relation "platform_schema.job" does not exist

原因: 导出时未包含pg-boss表

排查:

# 1. 检查导出的SQL文件
Get-Content rds_init_*.sql | Select-String "CREATE TABLE.*job"

# 应该看到:
# CREATE TABLE platform_schema.job ...
# CREATE TABLE platform_schema.queue ...
# 等6个表

# 2. 如果没有,重新导出
docker exec ai-clinical-postgres pg_dump -U postgres -d ai_clinical_research --format=plain --no-owner --no-acl > rds_init_new.sql

# 3. 重新导入

预防:

确保使用正确的导出命令:
  ✅ 使用 pg_dump导出整个数据库
  ❌ 不要用 prisma migrate只导出Prisma定义的表

问题5: 密码中的特殊字符导致连接失败

症状:

backend启动失败:
Error: password authentication failed for user "airesearch"

原因: DATABASE_URL中的密码未正确转义

解决:

# 错误示例(@ 未转义)
DATABASE_URL=postgresql://airesearch:Xibahe@fengzhibo117@host:5432/db

# 正确示例(@ 转义为 %40
DATABASE_URL=postgresql://airesearch:Xibahe%40fengzhibo117@host:5432/db

URL编码工具

// 在浏览器控制台运行
encodeURIComponent("Xibahe@fengzhibo117")
// 输出: Xibahe%40fengzhibo117

问题6: SAE应用无法连接RDS

症状:

SAE日志显示:
connection to server failed: Connection timed out

原因:

  1. 使用了外网地址(已删除)
  2. 白名单未包含VPC网段
  3. SAE和RDS不在同一VPC

排查步骤:

1. 确认使用内网地址:
   ✅ pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com内网
   ❌ pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com外网已删除

2. 确认白名单配置:
   RDS控制台 > 数据安全性 > 白名单设置
   应该包含: 172.17.0.0/16

3. 确认VPC一致:
   - RDS VPC: vpc-2ze055cptkew9c38w4r06
   - SAE VPC: 应该相同
   - 查看方式: SAE控制台 > 应用详情 > 网络配置

4. 确认SAE环境变量:
   DATABASE_URL=postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432/ai_clinical_research
   注意: 不要有 -ko 后缀

7. 回滚方案

7.1 回滚场景

需要回滚的情况:
  - 导入后发现数据不完整
  - 导入过程中断
  - 数据验证失败
  - 应用连接异常

7.2 回滚步骤

# 方案A: 删除数据库重新导入(推荐)

# 1. 连接到RDS
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com `
  -p 5432 `
  -U airesearch `
  -d postgres

# 2. 终止所有连接
SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = 'ai_clinical_research' AND pid <> pg_backend_pid();

# 3. 删除数据库
DROP DATABASE ai_clinical_research;

# 4. 重新创建并导入
CREATE DATABASE ai_clinical_research WITH ENCODING='UTF8';
\q

# 5. 重新导入
Get-Content rds_init_*.sql | docker exec -i -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql -h ... -d ai_clinical_research
# 方案B: 使用RDS快照恢复如果创建了快照

# 1. 登录RDS控制台
# 2. 备份恢复 > 备份列表
# 3. 找到导入前的快照
# 4. 点击「恢复」
# 5. 选择恢复方式:
#    - 按备份集恢复(恢复到快照时间点)
#    - 按时间点恢复PITR恢复到任意时间
# 6. 确认恢复

7.3 回滚验证

# 验证回滚后的数据
docker exec -e PGPASSWORD="Xibahe@fengzhibo117" ai-clinical-postgres psql `
  -h ... `
  -d ai_clinical_research `
  -c "SELECT schemaname, COUNT(*) FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') GROUP BY schemaname;"

8. 最佳实践

8.1 部署前准备

☑️ 准备检查清单:
  1. 本地数据库已备份
  2. RDS实例已创建并配置完成
  3. VPC网络已规划
  4. 白名单已配置VPC网段
  5. 数据库用户和密码已记录
  6. 时区已设置Asia/Shanghai
  7. 自动备份已开启

☑️ 时间窗口选择:
  - 业务低峰期如晚上11点后
  - 预留足够时间30-60分钟
  - 团队成员在线支持

8.2 执行过程中

☑️ 操作规范:
  1. 逐步执行,不要跳步骤
  2. 每步验证结果再继续
  3. 记录每步的输出和时间
  4. 遇到错误立即停止排查
  5. 不要同时执行多个操作

☑️ 安全意识:
  1. 外网访问最小化10分钟内完成
  2. 导入完成立即关闭外网
  3. 不要在公共网络操作
  4. 不要泄露连接信息

8.3 部署后检查

☑️ 功能验证:
  1. Schema和表数量正确
  2. 数据量与本地一致
  3. pg-boss表存在
  4. 索引和外键完整
  5. backend能正常连接
  6. 应用功能正常

☑️ 性能验证:
  1. 连接延迟 < 50msVPC内网
  2. 查询响应时间正常
  3. RDS CPU使用率 < 30%
  4. 连接数 < 100

☑️ 安全验证:
  1. 外网地址已删除 ✅
  2. 白名单只有VPC网段 ✅
  3. 密码强度高 ✅
  4. 自动备份已开启 ✅

8.4 监控告警

☑️ 配置监控:
  1. RDS连接数告警>300
  2. RDS CPU告警>70%
  3. RDS磁盘告警>80%
  4. 慢查询告警(>1秒
  5. 备份失败告警

☑️ 日常巡检:
  1. 每天检查RDS监控
  2. 每周查看慢查询日志
  3. 每月验证备份可用性
  4. 每季度恢复演练

8.5 文档维护

☑️ 更新文档:
  1. 记录实际执行时间
  2. 记录遇到的问题和解决方案
  3. 更新连接信息
  4. 补充特殊情况处理

☑️ 知识沉淀:
  1. 总结经验教训
  2. 优化部署流程
  3. 培训团队成员
  4. 建立FAQ

9. 附录

9.1 完整检查清单

部署前检查 (Before):
  ☐ 本地数据库运行正常
  ☐ Docker Desktop运行正常
  ☐ RDS实例已创建
  ☐ VPC和交换机已配置
  ☐ 白名单已配置172.17.0.0/16
  ☐ 数据库用户已创建airesearch
  ☐ 时区已设置Asia/Shanghai
  ☐ 自动备份已开启

部署过程检查 (During):
  ☐ 导出文件大小正常50-100 MB
  ☐ 外网地址申请成功
  ☐ 白名单临时配置0.0.0.0/0
  ☐ 数据库创建成功
  ☐ 数据导入完成(无错误)
  ☐ 外网地址已删除 ⭐⭐⭐

部署后检查 (After):
  ☐ 10个Schema全部存在
  ☐ 34个表全部存在
  ☐ pg-boss的6个表存在
  ☐ 用户数据完整
  ☐ 索引完整
  ☐ 外键完整
  ☐ backend能连接RDS
  ☐ 应用功能正常
  ☐ 外网访问已关闭 ⭐⭐⭐

9.2 快速参考

连接信息

RDS内网地址: pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432
数据库名: ai_clinical_research
用户名: airesearch
密码: Xibahe@fengzhibo117

DATABASE_URL:
postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=10&pool_timeout=10

常用命令

# 导出数据库
docker exec ai-clinical-postgres pg_dump -U postgres -d ai_clinical_research --no-owner --no-acl > backup.sql

# 导入数据库
Get-Content backup.sql | docker exec -i -e PGPASSWORD="密码" ai-clinical-postgres psql -h RDS地址 -U airesearch -d ai_clinical_research

# 检查Schema
docker exec -e PGPASSWORD="密码" ai-clinical-postgres psql -h RDS地址 -U airesearch -d ai_clinical_research -c "\dn"

# 检查表
docker exec -e PGPASSWORD="密码" ai-clinical-postgres psql -h RDS地址 -U airesearch -d ai_clinical_research -c "\dt platform_schema.*"

# 检查数据量
docker exec -e PGPASSWORD="密码" ai-clinical-postgres psql -h RDS地址 -U airesearch -d ai_clinical_research -c "SELECT COUNT(*) FROM platform_schema.users;"

📚 相关文档


📝 变更历史

版本 日期 作者 变更说明
v1.0 2025-12-24 AI助手 初始版本,基于实际部署经验

🆘 支持

如有问题,请检查:

  1. 本文档的「常见问题」章节
  2. RDS实时日志RDS控制台 > 日志管理)
  3. backend应用日志SAE控制台 > 日志)
  4. PostgreSQL部署策略摸底报告

文档结束

祝部署顺利!🎉