| # 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 版本信息 |