rag / postgresql-cleanup-guide.md
gaojintao01
feat: pg
40282a8
# PostgreSQL 数据库迁移失败清理指南
## 概述
本指南用于清理 AnythingLLM 项目中 PostgreSQL 数据库的失败迁移记录,特别是因 P3009 错误导致的迁移失败。
## 前提条件
- 数据库地址:`rag-ai.e.aivencloud.com:15005`
- 需要数据库连接凭证(用户名、密码、数据库名)
## 清理步骤
### 1. 连接到 PostgreSQL 数据库
使用 psql 命令行工具连接:
```bash
# 基本连接格式
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 表状态
连接后,首先查看迁移表的状态:
```sql
-- 查看所有迁移记录
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. 备份失败迁移记录(可选但推荐)
```sql
-- 创建备份表
CREATE TABLE _prisma_migrations_backup AS
SELECT * FROM _prisma_migrations
WHERE migration_name = '20230921191814_init';
-- 验证备份
SELECT COUNT(*) FROM _prisma_migrations_backup;
```
### 4. 清理失败记录
根据具体情况选择以下方案之一:
#### 方案 A:仅删除失败的迁移记录
```sql
-- 删除特定的失败迁移
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:清理所有未完成的迁移
```sql
-- 删除所有未完成的迁移
DELETE FROM _prisma_migrations
WHERE finished_at IS NULL;
-- 验证删除结果
SELECT * FROM _prisma_migrations WHERE finished_at IS NULL;
```
#### 方案 C:完全重置迁移表(谨慎使用)
```sql
-- 备份现有数据
CREATE TABLE _prisma_migrations_full_backup AS
SELECT * FROM _prisma_migrations;
-- 清空迁移表
TRUNCATE _prisma_migrations;
-- 验证表已清空
SELECT COUNT(*) FROM _prisma_migrations;
```
### 5. 检查数据库表结构
```sql
-- 列出所有表
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. 验证清理结果
```sql
-- 确认迁移表状态
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;
```
## 重新执行迁移
清理完成后,可以重新执行迁移:
```bash
# 在项目根目录执行
cd server
npx prisma migrate dev
# 或者使用生产环境命令
npx prisma migrate deploy
```
## 常见问题处理
### 1. 连接问题
如果无法连接,检查:
- 防火墙设置
- SSL 配置(Aiven 通常需要 SSL)
- 连接凭证是否正确
```bash
# 带SSL连接示例
psql "host=rag-ai.e.aivencloud.com port=15005 user=[用户名] dbname=[数据库名] sslmode=require"
```
### 2. 权限问题
确保用户有足够的权限:
```sql
-- 检查用户权限
SELECT * FROM information_schema.role_table_grants
WHERE grantee = '[用户名]';
```
### 3. 数据库不存在
如果数据库不存在,需要先创建:
```sql
-- 创建数据库(需要超级用户权限)
CREATE DATABASE anythingllm;
```
## 注意事项
1. **数据备份**:执行任何删除操作前,确保已备份重要数据
2. **生产环境**:在生产环境执行前,先在测试环境验证步骤
3. **迁移顺序**:确保迁移文件按正确顺序执行
4. **依赖关系**:注意迁移之间的依赖关系
## 验证清理成功
清理成功后,应该能够:
1. 成功连接到数据库
2. _prisma_migrations 表处于干净状态
3. 能够重新执行迁移命令
4. 迁移完成后所有表结构正确创建
## 联系支持
如果遇到问题,请提供:
- 错误信息和日志
- 执行的 SQL 命令
- 数据库版本信息
- Prisma 版本信息