File size: 4,361 Bytes
40282a8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
# 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 版本信息 |