数据库迁移
概览
OPL 数据空间 启动时通常会自动执行数据库迁移。大多数情况下不需要手动迁移。只有在升级失败、离线维护或数据库类型切换等特殊场景下,才应该人工运行 Alembic。
注意
如果你的部署启用了 组织,数据库 schema 升级成功不代表租户数据已经完全安全可用。升级后还可能需要额外核对 landing organization、文件归属同步和向量归属修复。
危险
手动迁移操作不当会直接损坏数据库。开始前必须先做可验证的备份。
什么时候才需要手动迁移
- 启动日志里明确出现 migration 错误
- 版本升级后自动迁移失败
- 你在做离线数据库维护
- 你在做 SQLite ↔ PostgreSQL 迁移
- 开发者明确要求你手动执行 Alembic
前置检查
- 已确认数据库位置
- OPL 数据空间 进程已经完全停止
- 已创建并验证备份
- 可以进入容器或本地 Python 运行环境
第一步:备份并验证
SQLite
cp /path/to/webui.db /path/to/webui.db.backup.$(date +%Y%m%d_%H%M%S)
sqlite3 /path/to/webui.db.backup "SELECT count(*) FROM user;"PostgreSQL
pg_dump -h localhost -U your_user -d open_webui_db > backup_$(date +%Y%m%d_%H%M%S).sql
head -n 20 backup_*.sql第二步:进入运行环境
Docker
docker stop open-webui
docker run --rm -it \
-v open-webui:/app/backend/data \
--entrypoint /bin/bash \
ghcr.io/open-webui/open-webui:main
cd /app/backend/open_webui本地安装
cd /path/to/open-webui/backend/open_webui
source ../../venv/bin/activate第三步:设置必须的环境变量
export DATABASE_URL="sqlite:////app/backend/data/webui.db"
export WEBUI_SECRET_KEY=$(cat /app/backend/.webui_secret_key)如果是 PostgreSQL,把 DATABASE_URL 改成对应的连接串即可。
危险
DATABASE_URL 和 WEBUI_SECRET_KEY 缺一不可。少了 WEBUI_SECRET_KEY,Alembic 在真正连库前就会失败。
第四步:先做只读诊断
alembic current -v
alembic heads
alembic history
alembic upgrade head --sql | head -30
alembic branches你要先确认:
- 当前数据库认为自己在哪个 migration
- 代码期望的 head 是什么
- 是否存在分叉、半迁移状态或明显不一致
第五步:执行迁移
标准升级:
alembic upgrade head常见错误:
No such table