news 2026/8/24 2:11:06

Bisheng 数据库实战指南:MySQL 配置、自动初始化与数据迁移一次讲透

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Bisheng 数据库实战指南:MySQL 配置、自动初始化与数据迁移一次讲透

Bisheng 数据库实战指南:MySQL 配置、自动初始化与数据迁移一次讲透

【免费下载链接】bishengBISHENG is an open LLM devops platform for next generation Enterprise AI applications. Powerful and comprehensive features include: GenAI workflow, RAG, Agent, Unified model management, Evaluation, SFT, Dataset Management, Enterprise-level System Management, Observability and more.项目地址: https://gitcode.com/GitHub_Trending/bi/bisheng

Bisheng(毕昇)是一个面向新一代 AI 应用的开源 LLM DevOps 平台,它的全部状态都落在 MySQL 数据库里。这篇文章带你把 Bisheng 数据库这一层看穿:从 my.cnf 的字符集与 sql_mode 参数,到首次启动时的自动初始化,再到升级时的数据迁移守则,最后用一段真实的任务状态更新代码收尾。

一、先摸清家底:Bisheng 到底存了哪些数据

在动手改配置之前,先花一分钟搞清楚表里装的是什么。Bisheng 的核心实体可以归成三组:

  • User / Role:用户与角色,构成基于 RBAC 的权限控制,角色还挂菜单与资源授权;
  • Flow / FlowVersion:工作流定义与其版本记录,每次发布的流程都有独立的版本快照;
  • Session / Task:AI 会话与任务执行状态,一次对话跑出来的每个任务节点都会落库,方便随时恢复和追溯。

这些表的模型定义用 SQLAlchemy + SQLModel 编写,全部放在src/backend/bisheng/database/models/目录下;会话(含同步与异步两套入口)由src/backend/bisheng/database/base.py统一管理。后面所有读操作都走这套会话。

二、动手之前:给 MySQL 做一次参数体检

Bisheng 的 MySQL 参数写死在docker/mysql/conf/my.cnf里,Docker 部署时直接生效。真正起决定作用的是下面这几行:

[mysqld] init_connect='SET collation_connection = utf8mb4_unicode_ci, NAMES utf8mb4' # 服务器级字符集 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # 严格模式:拒绝非法值入库 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

每个参数各管一件事:

  • utf8mb4 字符集:四字节编码,emoji、生僻字、特殊符号都能原样存下来,不会变问号;
  • STRICT_TRANS_TABLES 严格模式:非法的日期、超长的值直接被拒,而不是悄悄截断,数据质量从入口就守住;
  • 统一 utf8mb4_unicode_ci 排序规则:连接层和服务器层同一套 collation,中文按拼音或笔画排序时不会出现"同一词排两行"的怪事。

三、第一次启动:系统自动做了哪些初始化

你第一次把 Bisheng 跑起来,并不需要手工建表灌数据。入口在src/backend/bisheng/database/init_data.pyinit_default_data里,整个过程分五步:

  1. 防重锁:向 Redis 申请init_default_data锁,抢不到就直接退出;
  2. 建库建表:调用create_db_and_tables按 ORM 模型创建库表;
  3. 判空:先查角色表是否已有记录,有就跳过;
  4. 写默认角色:插入"系统管理员"和"普通用户"两个角色;
  5. 导入默认数据:创建默认管理员用户,并导入组件与模板数据。

下面的精简片段就是这套"幂等"逻辑的骨架:

async def init_default_data(): if await redis_client.asetNx('init_default_data', '1'): await db_service.create_db_and_tables() async with async_session_getter() as session: db_role = (await session.exec(select(Role).limit(1))).all() if not db_role: session.add(Role(id=AdminRole, role_name='系统管理员')) session.add(Role(id=DefaultRole, role_name='普通用户')) await session.commit()

redis_client.asetNx用的是 Redis 的"不存在才设置"语义:多实例同时启动时,只有第一个实例能拿到锁继续初始化,其余实例直接跳过,避免重复建表或重复插角色。

四、升级不炸库:Bisheng 数据迁移的四条守则

初始化只跑一次,之后你面对的更多是升级。已有的数据要安全演进,Bisheng 实践里守着四条规矩:

  1. 版本化:流程数据按 FlowVersion 表留版本,每次发布都有独立结构记录,出问题可以定位到具体版本再回滚;
  2. 增量 ALTER:新增字段、改索引都走 ALTER TABLE 增量变更,绝不删库重建——旧数据是资产,不是包袱;
  3. 迁移前备份:动核心表之前先备份,备份文件不在同一个故障域里才算数;
  4. 事务原子性:单次迁移包在事务里执行,要么整批成功,要么整批回滚,数据库里不会出现"迁移到一半"的中间态。

五、走读一次真实读写:任务状态更新

讲完结构,看一段真实读写。灵思(Linsight)的执行任务模型定义在src/backend/bisheng/linsight/domain/models/linsight_execute_task.pyLinsightExecuteTaskDao.update_by_id是典型的异步会话套路——查询、判空、逐字段赋值、提交、回读:

async def update_by_id(cls, task_id: str, **kwargs): async with async_session_getter() as session: task = (await session.exec( select(LinsightExecuteTask).where(LinsightExecuteTask.id == task_id) )).first() if not task: return None for key, value in kwargs.items(): setattr(task, key, value) session.add(task) await session.commit() await session.refresh(task) return task

这个模型有三个设计在替高并发场景兜底:主键是 UUID(CHAR(36)),并发插入不抢自增 ID 的写热点;task_typestatus都是枚举字段,状态取值被限制在ExecuteTaskTypeEnum/ExecuteTaskStatusEnum定义的集合里,不会写进脏值;create_timeserver_default=CURRENT_TIMESTAMP,时间戳由数据库生成,审计追踪不依赖应用层传参。

六、下一步往哪看

想再往深里走,三个目录值得挨个翻:

  • database/models:完整的数据模型定义,看每张表长什么样;
  • workflow:工作流引擎如何与这些表交互;
  • knowledge:知识库的数据管理与检索链路。

顺着代码从表结构读到引擎,Bisheng 的数据库层就没有黑盒了。

【免费下载链接】bishengBISHENG is an open LLM devops platform for next generation Enterprise AI applications. Powerful and comprehensive features include: GenAI workflow, RAG, Agent, Unified model management, Evaluation, SFT, Dataset Management, Enterprise-level System Management, Observability and more.项目地址: https://gitcode.com/GitHub_Trending/bi/bisheng

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 2:10:34

基于ROS 2与MoveIt 2的机器人洗碗系统:从视觉感知到力控抓取全链路实践

在工业自动化和家庭服务机器人领域,洗碗一直被视为一项需要精细操作和复杂感知的任务。传统工业机器人依赖于精确的预编程路径和固定夹具,难以应对家庭厨房中形状各异、位置随机的碗碟。然而,随着AI视觉识别与力控协同技术的成熟,…

作者头像 李华
网站建设 2026/8/24 2:10:04

如何 5 分钟跑通 Suno 音乐生成 API:新手部署与接口调用全解

如何 5 分钟跑通 Suno 音乐生成 API:新手部署与接口调用全解 【免费下载链接】Suno-API Create Music in Seconds with SunoAPI. 项目地址: https://gitcode.com/GitHub_Trending/su/Suno-API 你在做一个视频工具,每次要给视频配 BGM 都得手动去…

作者头像 李华
网站建设 2026/8/24 2:09:50

从提示词工程到AI Agent与工作流:大模型应用开发的演进与实践

这次我们直接进入主题。当你在各种AI工具和平台上看到“提示词工程”、“循环工程”、“AI Agent”、“工作流”这些词时,是不是感觉它们既相关又混乱?有人说“Prompt Engineering已死”,有人说“Agent是未来”,还有人说“工作流才…

作者头像 李华
网站建设 2026/8/24 2:09:41

3 分钟跑完 JetBrains 30 天试用重置(ide-eval-resetter)

3 分钟跑完 JetBrains 30 天试用重置(ide-eval-resetter) 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 装着 IntelliJ IDEA 的第 40 天,启动后顶栏弹出 "Evaluation exp…

作者头像 李华
网站建设 2026/8/24 2:09:16

pgvector Windows 安装实践:从 nmake 报错到 10 分钟跑通最近邻查询

pgvector Windows 安装实践:从 nmake 报错到 10 分钟跑通最近邻查询 【免费下载链接】pgvector Open-source vector similarity search for Postgres 项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector 本文讲清在 Windows 上编译安装 pgvector 向…

作者头像 李华
网站建设 2026/8/24 2:08:52

Node.js+Vue全栈招聘系统开发实践

1. 项目背景与核心价值最近在帮一家中型企业搭建内部招聘系统时,我选择了Node.jsVue的全栈方案。这个技术组合在招聘类平台开发中特别实用,Vue的组件化开发能快速构建复杂的交互界面,Node.js的高并发特性则完美匹配招聘平台流量波动大的特点。…

作者头像 李华