PostgreSQL 迁移失败清理方案
概述
本目录包含了清理 AnythingLLM 项目 PostgreSQL 数据库中失败迁移记录的多种方案。
问题背景
- PostgreSQL 迁移因 P3009 错误失败
- 初始迁移
20230921191814_init在 2025-09-27 04:54:44.002007 UTC 失败 - 所有迁移文件中的 DATETIME 类型已修复为 TIMESTAMP
- 需要清理数据库中的失败迁移记录,以便重新执行迁移
清理方案
方案一:使用自动化脚本(推荐)
1. Node.js 脚本
# 安装依赖(如果需要)
npm install pg
# 运行脚本
node cleanup-postgresql-migrations.js
2. Shell 脚本(Linux/macOS)
# 赋予执行权限
chmod +x quick-cleanup.sh
# 运行脚本
./quick-cleanup.sh
方案二:手动 SQL 执行
1. 使用 psql 命令行
# 连接到数据库
psql -h rag-ai.e.aivencloud.com -p 15005 -U [用户名] -d [数据库名] sslmode=require
# 执行 SQL 文件
\i cleanup-migrations.sql
2. 手动执行 SQL 命令
-- 查看失败迁移
SELECT * FROM _prisma_migrations WHERE finished_at IS NULL;
-- 创建备份
CREATE TABLE _prisma_migrations_backup AS
SELECT * FROM _prisma_migrations
WHERE finished_at IS NULL;
-- 删除失败记录
DELETE FROM _prisma_migrations WHERE finished_at IS NULL;
-- 验证结果
SELECT * FROM _prisma_migrations;
方案三:使用 GUI 工具
1. pgAdmin
- 连接到 PostgreSQL 服务器
- 选择数据库
- 打开查询工具
- 执行
cleanup-migrations.sql中的 SQL 命令
2. DBeaver
- 创建新连接
- 输入连接参数:
- 主机:rag-ai.e.aivencloud.com
- 端口:15005
- 数据库:[数据库名]
- 用户名:[用户名]
- 密码:[密码]
- SSL:必需
- 执行 SQL 脚本
3. 其他工具
- DataGrip
- Navicat
- HeidiSQL
- TablePlus
清理后的操作
清理完成后,可以重新执行迁移:
# 进入 server 目录
cd server
# 开发环境
npx prisma migrate dev
# 生产环境
npx prisma migrate deploy
文件说明
postgresql-cleanup-guide.md- 详细的清理指南cleanup-postgresql-migrations.js- Node.js 自动化脚本quick-cleanup.sh- Shell 快速清理脚本cleanup-migrations.sql- SQL 脚本文件
注意事项
- 备份重要:执行任何删除操作前,确保已备份重要数据
- SSL 连接:Aiven PostgreSQL 需要 SSL 连接
- 权限要求:确保数据库用户有足够的权限
- 生产环境:在生产环境执行前,先在测试环境验证
常见问题
Q: 如何检查迁移是否成功?
A: 运行以下命令查看迁移状态:
SELECT * FROM _prisma_migrations ORDER BY finished_at DESC;
Q: 清理后数据会丢失吗?
A: 不会。我们只清理迁移记录,不删除业务数据。
Q: 如果清理失败怎么办?
A: 检查数据库连接和权限,确保使用正确的 SSL 设置。
支持
如果遇到问题,请检查:
- 数据库连接参数是否正确
- 是否有足够的数据库权限
- 网络连接是否正常
- SSL 证书是否有效