DB-GPT 从 v0.5.0 升级到 v0.5.1:MySQL 数据库升级完整指南
【免费下载链接】DB-GPTopen-source agentic AI data assistant for the next generation of AI + Data products.项目地址: https://gitcode.com/GitHub_Trending/db/DB-GPT
本篇指南对应 DB-GPT 官方升级文档 docs/docs/upgrade/v0.5.1.md,面向已经部署 v0.5.0 并准备升级到 v0.5.1 的用户。升级的核心动作是为 AWEL 流程管理表dbgpt_serve_flow增加error_message字段,用于持久化流程(Flow)加载或注册失败时的错误信息。读完本文,你将掌握 v0.5.1 的完整升级步骤、备份与回滚策略,并从源码层面理解该字段如何与流程状态机协同工作。
升级概览:v0.5.1 究竟改了什么
v0.5.1 是一个以小版本数据库结构变更为主的升级版本。与 v0.5.0(该版本创建了dbgpt_serve_flow、gpts_app、gpts_app_detail、gpts_app_collection等新表,并为gpts_conversations、gpts_messages增加team_mode、current_goal等列)不同,v0.5.1 只做了一件事:向流程表dbgpt_serve_flow增加一个error_message列。
这一变更有一个关键的前提条件,直接影响你要不要执行本文的升级 SQL:
- 使用 SQLite:v0.5.1 无需任何数据库结构升级,直接升级代码并重启服务即可;
- 使用 MySQL:必须执行升级 SQL,为
dbgpt_serve_flow补上error_message列,否则新版代码在读写该字段时会因列不存在而报错。
升级前准备:务必备份你的数据库
升级是高风险操作,官方文档明确要求:为了防止数据丢失,升级前必须根据你自己的数据库类型对数据库进行备份。
MySQL 备份
最常用的是mysqldump,按库导出:
mysqldump -h <host> -P <port> -u <user> -p --single-transaction --routines --triggers dbgpt > dbgpt_backup_$(date +%Y%m%d_%H%M%S).sql说明:
--single-transaction用于 InnoDB 引擎的一致性快照备份,避免备份期间阻塞业务写入;备份完成后请确认.sql文件大小合理、内容非空。
SQLite 备份
SQLite 用户虽然不需要执行结构升级,但同样建议备份数据库文件(默认路径通常在数据目录下,可结合部署配置确认):
cp dbgpt.db dbgpt.db.bak_$(date +%Y%m%d_%H%M%S)说明:SQLite 备份务必在 DB-GPT 服务停止后进行,避免写缓存导致的文件不一致。
升级第一步:停止 DB-GPT 服务
数据库结构变更期间绝不能让服务继续运行,否则会出现读写竞争或列缺失导致的异常。停止方式取决于你的启动方式:
- 直接进程启动:
Ctrl+C或kill对应的主进程; docker compose部署:docker compose down(参见 docker-compose.yml);- systemd / supervisor 托管:使用对应的
stop命令。
停止后可以顺带确认没有残留的 Python / DB-GPT 相关进程。
升级第二步:执行 MySQL 数据库升级
在 MySQL 中执行下面的 SQL(与官方文档 docs/docs/upgrade/v0.5.1.md 及升级脚本 assets/schema/upgrade/v0_5_1/upgrade_to_v0.5.1.sql 完全一致):
USE dbgpt; ALTER TABLE dbgpt_serve_flow ADD COLUMN `error_message` varchar(512) null comment 'Error message' after `state`;该语句的逐段解读
| 片段 | 含义 |
|---|---|
USE dbgpt; | 切换到 DB-GPT 默认数据库。如果你的库名不同,请替换为实际库名 |
ALTER TABLE dbgpt_serve_flow | 作用于 AWEL 流程表 |
ADD COLUMN error_message varchar(512) null | 新增错误信息列,类型varchar(512),允许为空(旧数据自动为NULL) |
comment 'Error message' | 字段注释,便于 DBA 理解 |
after state | 新列紧邻state列之后,保持列顺序与 v0.5.0 全量建表脚本 中dbgpt_serve_flow的定义一致 |
varchar(512)的长度选择与后端代码的截断逻辑严格对应:SQLAlchemy 模型ServeEntity.error_message定义为String(512)(见 packages/dbgpt-serve/src/dbgpt_serve/flow/models/models.py),而 DAO 层在写入前会把错误信息截断为前 500 个字符(error_message[:500],见 models.py 与 models.py),保证任何情况下都不会溢出列宽。
你也可以直接使用仓库中提供的升级脚本,避免手敲出错:
mysql -u <user> -p < assets/schema/upgrade/v0_5_1/upgrade_to_v0.5.1.sql验证升级结果
执行以下查询确认列已存在:
SHOW COLUMNS FROM dbgpt_serve_flow LIKE 'error_message';预期输出中Field为error_message、Type为varchar(512)、Null为YES。同时可以顺手验证表内数据完好无损:
SELECT COUNT(*) FROM dbgpt_serve_flow;深入源码:error_message 字段在 v0.5.1 中如何工作
理解这个字段的用途,才能明白这次升级为什么必要。error_message与流程状态state是一对,共同记录一条流程的生命周期。
状态机与错误持久化
流程状态的枚举定义在 packages/dbgpt-core/src/dbgpt/core/awel/flow/flow_factory.py:
class State(str, Enum): """State of a flow panel.""" INITIALIZING = "initializing" DEVELOPING = "developing" TESTING = "testing" DEPLOYED = "deployed" RUNNING = "running" DISABLED = "disabled" LOAD_FAILED = "load_failed"其中LOAD_FAILED正是 v0.5.1 新增错误持久化的目标状态。在 Flow 服务层 packages/dbgpt-serve/src/dbgpt_serve/flow/service/service.py 中可以看到两条写入路径:
- 构建 DAG 失败:当流程定义(JSON 或 Python)无法被
_flow_factory.build()解析时,服务将状态置为LOAD_FAILED并记录request.error_message = str(e),随后落库(见 service.py); - 注册 DAG 失败:当 DAG 构建成功但注册到
dag_manager失败时,错误信息会带上前缀Register DAG error: ...一并写入(见 service.py)。
而流程成功注册进入RUNNING状态时,error_message会被清空为""(见 service.py)。重启服务时load_dag_from_db()会重新加载数据库中的流程并执行同样的状态刷新逻辑(见 service.py)。
可以推断:v0.5.1 引入error_message的核心动机,是让"流程加载/注册失败"这类运行时错误能够持久化到数据库中,从而在管理界面或后续查询中直接看到失败原因,而不是依赖易丢失的进程日志。这也解释了为什么该列紧跟state列放置——两者在语义上紧密关联。
升级第三步:安装依赖并重启
数据库升级完成后,根据你的安装方式安装依赖:
- 源码安装(默认方式):在仓库根目录执行
pip install -e ".[default]"- Docker 镜像方式:使用 v0.5.1 对应的新镜像重新构建或拉取(参见 docker/Dockerfile 与 docker/allinone/Dockerfile 了解构建方式);
- 其他部署方式:参照你的部署脚本升级到 v0.5.1 版本。
依赖就绪后,按你的启动方式重新拉起 DB-GPT 服务,并检查以下日志点:
- 服务正常启动、无
Unknown column 'error_message'之类的 SQL 报错; - 若曾在 v0.5.0 中创建过流程,重启后这些流程能被正常加载(对应
load_dag_from_db逻辑); - Web 界面(流程管理页)可正常打开,已存在流程能显示名称、状态等基本信息。
回滚方案:出现问题怎么办
如果在升级后遇到异常,可按以下顺序回滚:
- 停止 DB-GPT 服务;
- 恢复数据库备份(MySQL 使用
mysql < dbgpt_backup_*.sql,SQLite 直接替换.db文件); - 将代码/镜像回退到 v0.5.0;
- 重新启动服务验证。
说明:v0.5.1 新增列是
NULL允许的、可回滚的增量变更;但由于无法确认 v0.5.0 代码是否容忍多余列的存在,稳妥做法仍是先停服再恢复备份。
常见问题(FAQ)
Q1:SQLite 用户真的什么都不用做吗?是的。官方文档明确说明使用 SQLite 无需升级数据库。SQLite 是文件型数据库,DB-GPT 的元数据管理会自动兼容新增字段,直接升级代码重启即可。不过仍建议做文件备份。
Q2:我的库名不是dbgpt,需要改动 SQL 吗?需要。把USE dbgpt;换成你的实际数据库名即可,其余语句不变。
Q3:重复执行这条ALTER TABLE会怎样?MySQL 会报Duplicate column name 'error_message',这是正常提示,不代表数据损坏。执行前先用SHOW COLUMNS检查是否已存在该列。
Q4:升级后流程管理页面出现了失败状态,怎么排查?这正说明error_message在发挥作用。在数据库中查询:
SELECT uid, name, state, error_message FROM dbgpt_serve_flow;state = 'load_failed'的行会带有具体错误信息,可据此定位 DAG 定义或依赖注册的问题。
延伸阅读
- 完整的 v0.5.0 建表与升级历史:本文档同目录的 v0.5.0.md;
- v0.5.1 升级脚本与 v0.5.0 全量 Schema:assets/schema/upgrade/v0_5_1/;
dbgpt_serve_flow表的 SQLAlchemy 模型与 DAO 实现:packages/dbgpt-serve/src/dbgpt_serve/flow/models/models.py;- Flow 服务层的 DAG 构建、注册与错误持久化逻辑:packages/dbgpt-serve/src/dbgpt_serve/flow/service/service.py;
- 流程状态机
State定义:packages/dbgpt-core/src/dbgpt/core/awel/flow/flow_factory.py。
以上即 v0.5.1 的全部升级要点:一次备份、一次ALTER TABLE、一次重启。对 MySQL 用户而言,缺失error_message列会导致新版 Flow 服务在读写流程记录时失败,因此请务必在停止服务后、升级代码前完成数据库变更。
【免费下载链接】DB-GPTopen-source agentic AI data assistant for the next generation of AI + Data products.项目地址: https://gitcode.com/GitHub_Trending/db/DB-GPT
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考