Dolt 介绍与选型指南

深度介绍开源版本化 SQL 数据库 Dolt(Git for Data):MySQL 兼容内核、分支/合并/回滚的数据工作流、核心架构与适用边界,并与 MySQL、SurrealDB、LakeFS 横向对比给出选型结论。基于 Dolt v2.5.0 官方实查。

DoltDolt2026/10/18

Dolt 介绍与选型指南

‍‍​​‌​> 目标:面向「想让数据像代码一样有分支、合并、回滚与审计能力」的工程师,系统介绍 Dolt 的定位、架构、功能与适用边界,并与 MySQL、SurrealDB、LakeFS 等同类产品做选型对比;本文为认知篇,全部版本、许可与社区数据均在 2026-10-18 联网实查官方来源,不做本地安装实测(安装与命令实测见《Dolt 安装部署指南》《Dolt 版本化 SQL 实战》)。

一、环境信息

本文为 A1 认知篇,所有论断均基于官方来源实查,信息基准如下:

💡 技术拓展:「Git for Data」(数据版本控制)目前有三条主流技术路线,选型前先分清——

路线原理代表产品特点
版本化数据库内核把 commit/branch/merge 做进数据库引擎,SQL 直查任意历史版本Dolt、DoltgreSQL、TerminusDB版本能力最完整(行级 diff、冲突解决、AS OF 查询);引擎本身较新
数据湖版本层在对象存储(S3/HDFS)之上为 Parquet 等文件提供 commit/branchLakeFS、Delta Lake、Apache Iceberg面向批处理/数仓管线,不面向事务型 OLTP 查询
多模型数据库内置部分版本化或不可变数据能力SurrealDB(多模型)、XTDB(bitemporal)灵活但版本语义通常弱于专用内核

本文选型对象为 Dolt,属于第一条路线中「MySQL 兼容方言」的代表实现:对熟悉 MySQL 的团队,Dolt 的迁移与使用成本最低。

二、软件概述

Dolt 官方口号是 "Git for Data":它是一个把 Git 的分布式版本控制语义(commit、branch、merge、diff、clone、push/pull)完整移植进 SQL 关系型数据库的开源产品。用官方 README 的原话说,Dolt 是 "the world's first version-controlled SQL database"(第一个版本可控的关系型 SQL 数据库)。

与「Git 管理 SQL 脚本」的传统做法不同,Dolt 版本化的对象是数据本身:每一行数据、每一条 schema 变更都记录在提交图(commit graph)里,可以回答「这行数据是谁在什么时候改的」「上周五的库存表长什么样」「两个分支的数据改动合并冲突了怎么解决」这类问题。

关键事实(2026-10-18 实查):

项目值来源
当前最新稳定版v2.5.0GitHub releases/latest 重定向实测
开源许可Apache License 2.0仓库 LICENSE 页实查
实现语言Go(编译为单一静态链接二进制)仓库主语言 + 解包实测 file 命令确认 statically linked
GitHub stars24,663仓库页面实查(2026-10-18)
forks约 830第三方仓库统计(2026-10 抓取)
维护方DoltHub, Inc.(美国,Y Combinator 孵化)官方博客与文档
发布节奏极高频(几乎每周 patch,季度级 minor)releases 列表实查
协议兼容MySQL 兼容服务端(select version() 实测返回 8.0.31)《Dolt 集成实战》实测

💡 说明:Dolt 的发行物是一个单二进制:同一份 dolt 命令既是本地数据库客户端(dolt sql),也是 MySQL 兼容服务端(dolt sql-server),还兼任 Git 式仓库管理工具(dolt branch/merge/clone)。这让部署面非常小——解压一个约 120MB 的 ELF 文件即可运行,无外部依赖。

三、核心架构

Dolt 的架构可以概括为「三层」:Git 式引用层、内容寻址存储层、SQL 引擎层。理解这三层有助于判断它的能力边界。

3.1 Git 式引用与提交图

Dolt 在每个数据库目录下维护一个 .dolt/ 目录(实测结构包含 noms/、repo_state.json、stats/ 等),语义上等同 Git 的 .git/:

  • main/feature-x 等分支与 tag 都是指向提交的命名引用;
  • 每个提交记录一个完整的数据快照引用 + 父提交指针,形成有向无环图(DAG);
  • dolt merge 做三方合并,遇到同主键行竞争时产出冲突集,用 dolt conflicts 系列命令解决(实测见《Dolt 版本化 SQL 实战》)。

3.2 内容寻址存储(Noms 血统)

Dolt 的存储层源自 Noms 项目(其前创始团队的产品):数据按**内容寻址(content-addressed)**的方式切块存储,两个分支共享未修改的数据块,因此「克隆一个分支」的成本近似于写一个引用,而非复制整库。这也让 dolt diff 可以只读两棵树的结构差异,不需要回放日志。

3.3 SQL 引擎与 MySQL 兼容

Dolt 内置自研 SQL 引擎(Go 实现),支持 DDL/DML/事务/外键/视图/存储过程调用等常用子集,并通过 dolt sql-server 暴露 MySQL wire protocol(实测 select version() 返回 8.0.31,mysql 8.0/8.4 CLI 与 pymysql 驱动均直连成功,见《Dolt 集成实战》)。MySQL 客户端生态(CLI、GUI 工具、各语言驱动)可以直接连 Dolt 使用。

架构取舍:版本化不是免费的——每次写事务都要维护提交结构与内容块,且 Dolt 的执行器成熟度不及 MySQL 数十年打磨的 InnoDB。官方基准也承认 Dolt 写入性能低于原生 MySQL(约数倍差距,随版本快速改善)。因此 Dolt 的合理用法是「用 MySQL 的写法,获得 Git 的能力」,而不是「替换高并发 OLTP 主库」。

四、功能特性

以下特性均在 v2.5.0 实测可用(逐条实测过程见关联篇目,此处只给结论与出处):

  • 分支与合并:dolt branch/checkout/merge,支持 fast-forward 与三方合并;纯 SQL 内可用 DOLT_BRANCH()/DOLT_CHECKOUT()/DOLT_MERGE() 存储过程完成同一闭环(《Dolt 版本化 SQL 实战》实测)。
  • 行级 diff:dolt diff 与 DOLT_DIFF() 表函数给出两个提交间的行级差异;dolt query-diff 甚至能 diff 两条 SQL 的结果集。
  • 时间旅行:SELECT ... FROM table AS OF '<commit 或分支>' 直接查询任意历史版本;dolt_history_<table> 系统表返回每一行的完整修改历史(《Dolt 版本化 SQL 实战》实测)。
  • 行级追溯:dolt blame 显示每行最后被哪个提交修改(对标代码的 git blame)。
  • 冲突管理:冲突数据落在 dolt_conflicts 系统表,可用 CLI(dolt conflicts cat/resolve)或 SQL(DOLT_CONFLICTS_RESOLVE())解决,实测含 --ours/--theirs 与手工 SQL 两种路径。
  • MySQL 协议服务端:dolt sql-server 监听 3306(或自定义端口,实测 13911),mysql CLI / pymysql 均可 CRUD 并远程调用版本化存储过程(《Dolt 集成实战》实测)。
  • 远程仓库协作:dolt remote/push/pull/clone,官方托管 DoltHub(类比 GitHub),亦可自建 remote(本地路径 / AWS S3 / GCS 均支持)。
  • systemd 托管友好:单二进制 + WorkingDirectory 即可包装为标准 systemd 服务,实测 systemctl enable --now 与重启自拉起均正常(《Dolt 安装部署指南》实测)。

五、快速上手

以下最小示例引自官方文档 Quick Start(https://docs.dolthub.com/introduction/quickstart ,查询日期 2026-10-18),在任意空目录执行即可体会「Git 工作流」味道;完整实测过程与回显见《Dolt 快速入门》:

dolt init                                  # 初始化一个数据仓库(等同 git init)
dolt sql -q "create table t1 (id int primary key, name varchar(50))"   # 建表
dolt add t1 && dolt commit -m "init t1"    # 暂存并提交(数据 + schema 一起进版本库)
dolt checkout -b feature                   # 开分支
dolt sql -q "insert into t1 values (1, 'hello')"
dolt commit -am "add row"                  # 提交分支上的数据变更
dolt checkout main && dolt merge feature   # 合并回主干

说明:dolt sql -q 是「单条 SQL 退出」模式;dolt sql 不带参数进入交互式 SQL Shell。日常操作可以在 CLI 工作流(Git 用户零学习成本)与 SQL 工作流(数据库用户零学习成本)之间自由切换。

六、适用场景与限制

6.1 高价值场景

  • 数据协作与共享:把数据库当开源项目运营——官方 DoltHub 上大量公开数据集(如官方维护的世界各国统计库 dolthub/covid-19-dashboard 等)支持 PR 式贡献:贡献者 fork 数据库、本地改数、push 回来发 PR,维护者 review diff 后 merge。这是 Dolt 独有的能力。
  • 变更审计与合规:金融、医疗、供应链等需要回答「谁在何时改了哪行」的场景,dolt log/blame/history 开箱即得,不需要自建审计中间件。
  • 数据管线试运行与回滚:ETL/定价/风控规则先在分支上跑批,验证 diff 无误再 merge,出错 dolt reset --hard 秒级回滚。
  • 测试数据管理:给每条测试分支克隆一份带版本的数据快照,替代「造数脚本」。

6.2 限制与代价(实测/官方口径)

  • 写入放大:版本结构带来的写入开销使 Dolt 吞吐低于原生 MySQL;官方 benchmark 页承认该差距且持续优化中。高并发 OLTP 主库不是它的目标。
  • SQL 兼容是子集:MySQL 协议兼容 ≠ 功能全兼容。存储过程定义、部分系统函数、特定优化器行为与 MySQL 有差异;information_schema 可用但非全量(实测边界见《Dolt 集成实战》)。
  • 单机为主:dolt sql-server 是单进程单写者服务,没有内建的集群/主从复制形态(高可用依赖外部手段,如备份 + 快速拉起)。
  • 生态体量:社区规模(2.4 万 stars 量级)与 MySQL 生态不可同日而语;商业支持依赖 DoltHub 公司。

七、同类选型对比

7.1 横向对比表

维度Dolt v2.5.0MySQL 8.xLakeFSSurrealDB
产品类型版本化 SQL 数据库关系型数据库(基线)数据湖 Git 层(对象存储上)多模型分布式数据库
版本化粒度行 + schema,提交图无(需 binlog/触发器自建)文件/对象级(commit 挂在 lake 路径上)无内建提交图(有部分不可变能力)
SQL 兼容MySQL 方言子集 + 版本化扩展完整不适用(面向 Spark/Trino 等)自有 SQL 方言(SurrealQL)
MySQL 协议原生兼容(实测 8.0.31)原生无无
时间旅行查询AS OF / history 表(实测)无(需人工快照)可回溯文件版本有限
冲突解决行级三方合并(实测)不适用合并在对象/元数据层不适用
协作形态push/pull/PR(DoltHub 或自建 remote)主从复制Git 工作流 + 对象存储分布式多主
实现语言GoC/C++GoRust
许可Apache-2.0(实查)GPL(社区版)Apache-2.0BSL/商用双许可(1.x 后)
典型定位数据协作/审计/版本化 OLTP-lite通用 OLTP数湖/数仓管线版本控制新式应用后端(文档+图+向量)

7.2 社区活跃度与版本节奏

  • Dolt:24,663 stars(2026-10-18 实查),2026-02-23 突破 20k(官方博客),v2.5.0 于 2026-10 发布;releases 高频(几乎每周),issue 响应以 DoltHub 团队为主,响应速度快。
  • MySQL:体量无争议的第一梯队,但无版本化能力;版本节奏保守(LTS 8.4/创新版 9.x)。
  • LakeFS:stars 万级(约 5k 量级,第三方统计),定位与 Dolt 互补而非替代——LakeFS 管数据湖文件,Dolt 管关系表。
  • SurrealDB:多模型路线,版本能力非核心;与本站《SurrealDB 介绍与选型指南》篇的结论互补阅读。

7.3 兼容矩阵

  • 与 MySQL 生态:mysql 8.0/8.4 CLI、pymysql 实测直连成功;ORM(SQLAlchemy/GORM 等)走 MySQL 方言通常可连,但遇到 Dolt 未实现的函数/语法会报错,需按项目实测。
  • 与数据工具链:支持 dolt dump 导出 SQL 文件、CSV/JSON 导入导出、dolt table import;BI 工具凡走 MySQL 驱动均可尝试接入。
  • 与 Git 仓库:Dolt 管数据、Git 管代码,二者在 CI 里可并行(官方提供 Dolt CI 能力,v2.5.0 实测 dolt ci 子命令存在)。

八、选型结论

按场景给出「如果…则…」建议:

  1. 需要「数据像代码一样 review、merge、回滚、审计」 → Dolt 是当前唯一同时满足「行级合并冲突解决 + AS OF 查询 + MySQL 协议」的开源产品,首选。
  2. 纯高并发 OLTP、无版本化诉求 → 留在 MySQL/PostgreSQL,Dolt 的写入开销是纯负债。
  3. 版本化对象是数据湖文件(Parquet/CSV on S3) → 选 LakeFS/Iceberg,不是 Dolt。
  4. 需要多模型(文档/图/向量)与水平扩展 → 看 SurrealDB 等多模型数据库,版本化不是其强项。
  5. PostgreSQL 方言团队 → 可关注官方姊妹项目 DoltgreSQL(PG 方言版 Dolt),成熟度晚于 Dolt 本体。

一句话结论:Dolt 适合把「数据变更过程」本身当作资产管理(协作、审计、试运行、回滚)的团队;它不是 MySQL 的替代品,而是给 MySQL 工作流装上 Git。

九、参考链接