Bintrail:利用索引二进制日志实现 MySQL 时间旅行查询
点击查看原文>
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 则提供了三个扩展来实现这一功能。
/filters:no_upscale()/news/2026/05/bintrail-mysql-timetravel/en/resources/1Captura-de-pantalla-2026-05-06-a-las-1.58.53-p.m-1024x508-1779305185335.png)
图片来源: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.ordersAS 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.ordersBETWEEN '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