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;
注意事项
- 数据备份:执行任何删除操作前,确保已备份重要数据
- 生产环境:在生产环境执行前,先在测试环境验证步骤
- 迁移顺序:确保迁移文件按正确顺序执行
- 依赖关系:注意迁移之间的依赖关系
验证清理成功
清理成功后,应该能够:
- 成功连接到数据库
- _prisma_migrations 表处于干净状态
- 能够重新执行迁移命令
- 迁移完成后所有表结构正确创建
联系支持
如果遇到问题,请提供:
- 错误信息和日志
- 执行的 SQL 命令
- 数据库版本信息
- Prisma 版本信息