社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

Bintrail:利用索引二进制日志实现 MySQL 时间旅行查询

InfoQ • 5 月前 • 217 次点击  
作者 | Renato Losio
译者 | 平川

Bintrail 是一个新推出的数据层,为 MySQL 带来了 针对特定时间点的查询和行级历史查询功能。在主要的关系型数据库中,MySQL 是目前唯一缺乏时间查询功能原生支持的。Bintrail 通过在 ProxySQL 后面使用索引二进制日志,无需修改 MySQL 或应用程序代码,即可支持按过去的时间戳查询数据并查看变更历史。该功能主要面向恢复和审计场景。

该方法将基于 ProxySQL 的查询路由与索引二进制日志相结合,为标准 MySQL 添加了时间旅行查询功能 AS OF 和 BETWEEN 。Bintrail 解析 MySQL 中 ROW 格式的二进制日志,为每个行事件建立包含完整前后快照的索引,并生成用于特定时间点恢复的逆向 SQL 语句,整个过程不需要原始二进制日志文件。数据库专家 Daniel Guzman-Burgos 解释了他启动该项目的初衷:

上个月,我详细介绍了除 MySQL 之外所有主要 OLTP 系统如何开箱即用地提供针对特定时间点的查询功能。Oracle 提供了 AS OF TIMESTAMP 语句;SQL Server 提供了 FOR SYSTEM_TIME AS OF 语句;MariaDB 默认支持系统版本化表;而 PostgreSQL 则提供了三个扩展来实现这一功能。

图片来源:dbtrail 博客

在 Oracle 和 SQL Server 中,历史状态可以直接查询。而在 MySQL 中,恢复或检查过去的数据状态通常需要围绕二进制日志进行操作,而不是通过原生的时间查询来实现。

在一篇专门比较主流关系型数据库选项的 文章 中,作者指出,可查询的历史数据与原始日志数据之间的实际差距,正是许多恢复和审计事件发生的原因。Guzman-Burgos 补充道:

在 Oracle 中,Flashback 功能已经存在了四分之一世纪。Temporal Tables 十年前就已经登陆 SQL Server。CockroachDB 自发布之日起便支持时间旅行功能。PostgreSQL 用户需要依赖扩展,因为这一缺失太过明显,无法忽视。MariaDB 从 MySQL 分支出来,并实现了这一功能。而 Oracle MySQL 现在没有实现,将来也不会实现,而且也没有任何动力去实现。

_diff 查询会返回指定时间范围内所有的行级变更,包括事件类型、GTID 以及变更前后的值。虽然 SQL Server、MariaDB 和 Oracle 提供了多种形式的行级历史查询,但它们通常仅提供存储的行版本,并且依赖于时间存储或保留设置。相比之下,Bintrail 直接从已经建立索引的 MySQL 二进制日志中读取数据,从而能够重建行在任意选定时间段内的完整变更序列。

-- 42 号订单在过去任意时刻的状态SELECT * FROM _flashback.orders  AS OF '2026-04-15 09:30:00'  WHERE id = 42;-- 或者说那一瞬间的整个表(当时存在的每一行)SELECT * FROM _flashback.orders AS OF '2026-04-15 09:30:00';-- 指定时间段内 42 订单的每次变更SELECT * FROM _diff.orders  BETWEEN '2026-04-15 00:00:00' AND '2026-04-15 23:59:59'  WHERE id = 42;

Bintrail 可以自动生成 ProxySQL 路由规则,将 _flashback、_diff 和 _snapshot 等历史查询模式引导至其自身的后端,同时不影响正常的 MySQL 流量。该系统维护着独立于 MySQL 二进制日志保留策略的索引历史存储,使历史查询能够覆盖更长的时段,并且可以选择扩展至存储在 S3 上的归档 Parquet 数据。Guzman-Burgos 写道:

无需执行 ALTER TABLE 语句即可启用系统版本控制。无需特殊的存储引擎。无需二进制日志重放工具。使用相同的 MySQL 和驱动程序:只需要将连接指向 ProxySQL 而不是真实的 MySQL 端口,其余功能就可以正常运行。

Percona 创始人、开源倡导者 Peter Zaitsev 写道:

Daniel Guzmán Burgos 在提升 MySQL 恢复能力方面不断推出高效解决方案,成果斐然。

在谈到这一新功能时,Releem 创始人 Roman Agabekov 指出:

完整地恢复备份通常耗时过长、速度过慢且风险过高。尤其是在当前这种情况下更是如此,因为由 AI 生成的 SQL 语句、自动化脚本以及运维变更的速度都比以往更快了。自动化程度的提高虽然加快了速度,但也对精准恢复提出了更高的要求。

就目前的限制而言,Bintrail 仅支持字面时间戳查询、主键查找以及受限的全表恢复,而连接操作和更复杂的过滤则必须在适配层之外处理。Bintrail 已经发布在 GitHub 上,采用 BUSL 许可(一种开源许可)。

原文链接:

https://www.infoq.com/news/2026/05/bintrail-mysql-timetravel/

声明:本文由 InfoQ 翻译,未经许可禁止转载。

点击底部阅读原文访问 InfoQ 官网,获取更多精彩内容!

今日好文推荐

中国首次提出半导体演进新原则:华为“韬定律”5 年内冲刺等效1.4nm制程,麒麟、昇腾将先后落地量产

硅谷深陷算力荒:H200一夜涨价30%,H100抢到缺货,Karpathy也未能幸免

别再骂 Claude 限速了,Boris 亲口承认:最挑剔的用户,反而最离不开我们

模型之外,皆属Harness!DeepSeek终于出手:招人、组队、从零造一个中国版Claude Code

图片

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/196987