rag / postgresql-cleanup-guide.md
gaojintao01
feat: pg
40282a8

PostgreSQL 数据库迁移失败清理指南

概述

本指南用于清理 AnythingLLM 项目中 PostgreSQL 数据库的失败迁移记录,特别是因 P3009 错误导致的迁移失败。

前提条件

  • 数据库地址:rag-ai.e.aivencloud.com:15005
  • 需要数据库连接凭证(用户名、密码、数据库名)

清理步骤

1. 连接到 PostgreSQL 数据库

使用 psql 命令行工具连接:

# 基本连接格式
psql -h rag-ai.e.aivencloud.com -p 15005 -U [用户名] -d [数据库名]

# 示例(需要替换实际凭证)
psql -h rag-ai.e.aivencloud.com -p 15005 -U postgres -d anythingllm

或者使用 pgAdmin、DBeaver 等 GUI 工具连接。

2. 检查 _prisma_migrations 表状态

连接后,首先查看迁移表的状态:

-- 查看所有迁移记录
SELECT * FROM _prisma_migrations ORDER BY finished_at DESC;

-- 查看失败的迁移
SELECT * FROM _prisma_migrations 
WHERE finished_at IS NULL 
   OR logs LIKE '%ERROR%' 
   OR logs LIKE '%P3009%'
ORDER BY started_at DESC;

3. 备份失败迁移记录(可选但推荐)

-- 创建备份表
CREATE TABLE _prisma_migrations_backup AS 
SELECT * FROM _prisma_migrations 
WHERE migration_name = '20230921191814_init';

-- 验证备份
SELECT COUNT(*) FROM _prisma_migrations_backup;

4. 清理失败记录

根据具体情况选择以下方案之一:

方案 A:仅删除失败的迁移记录

-- 删除特定的失败迁移
DELETE FROM _prisma_migrations 
WHERE migration_name = '20230921191814_init'
AND (finished_at IS NULL OR logs LIKE '%P3009%');

-- 验证删除结果
SELECT * FROM _prisma_migrations WHERE migration_name = '20230921191814_init';

方案 B:清理所有未完成的迁移

-- 删除所有未完成的迁移
DELETE FROM _prisma_migrations 
WHERE finished_at IS NULL;

-- 验证删除结果
SELECT * FROM _prisma_migrations WHERE finished_at IS NULL;

方案 C:完全重置迁移表(谨慎使用)

-- 备份现有数据
CREATE TABLE _prisma_migrations_full_backup AS 
SELECT * FROM _prisma_migrations;

-- 清空迁移表
TRUNCATE _prisma_migrations;

-- 验证表已清空
SELECT COUNT(*) FROM _prisma_migrations;

5. 检查数据库表结构

-- 列出所有表
SELECT table_name FROM information_schema.tables 
WHERE table_schema = 'public' 
AND table_type = 'BASE TABLE'
ORDER BY table_name;

-- 检查是否存在业务数据表
SELECT EXISTS (
   SELECT FROM information_schema.tables 
   WHERE table_schema = 'public' 
   AND table_name = 'users'
);

6. 验证清理结果

-- 确认迁移表状态
SELECT 
    migration_name,
    started_at,
    finished_at,
    CASE 
        WHEN finished_at IS NULL THEN 'FAILED'
        ELSE 'COMPLETED'
    END as status
FROM _prisma_migrations
ORDER BY started_at DESC;

重新执行迁移

清理完成后,可以重新执行迁移:

# 在项目根目录执行
cd server
npx prisma migrate dev

# 或者使用生产环境命令
npx prisma migrate deploy

常见问题处理

1. 连接问题

如果无法连接,检查:

  • 防火墙设置
  • SSL 配置(Aiven 通常需要 SSL)
  • 连接凭证是否正确
# 带SSL连接示例
psql "host=rag-ai.e.aivencloud.com port=15005 user=[用户名] dbname=[数据库名] sslmode=require"

2. 权限问题

确保用户有足够的权限:

-- 检查用户权限
SELECT * FROM information_schema.role_table_grants 
WHERE grantee = '[用户名]';

3. 数据库不存在

如果数据库不存在,需要先创建:

-- 创建数据库(需要超级用户权限)
CREATE DATABASE anythingllm;

注意事项

  1. 数据备份:执行任何删除操作前,确保已备份重要数据
  2. 生产环境:在生产环境执行前,先在测试环境验证步骤
  3. 迁移顺序:确保迁移文件按正确顺序执行
  4. 依赖关系:注意迁移之间的依赖关系

验证清理成功

清理成功后,应该能够:

  1. 成功连接到数据库
  2. _prisma_migrations 表处于干净状态
  3. 能够重新执行迁移命令
  4. 迁移完成后所有表结构正确创建

联系支持

如果遇到问题,请提供:

  • 错误信息和日志
  • 执行的 SQL 命令
  • 数据库版本信息
  • Prisma 版本信息