上一期我们介绍了PolarDB-X Lizard 备份技术的架构与实现,详细见历史文章《PolarDB-X 存储引擎核心技术 | Lizard 无锁备份》。本文继续从数据“闪回”恢复层面,对比和分析不同数据“闪回”的技术实现方式的使用体验和性价比。
技术背景与使用场景
闪回技术,顾名思义,是指数据库系统提供的一种能力,允许用户查看和恢复到过去某个时间点的状态,或者回滚特定操作,而无需依赖传统的备份与恢复机制。这一功能极大地增强了数据库的灵活性和可靠性,为数据库管理员和开发人员提供了一种快速响应错误、审计数据变更以及进行问题诊断的有效手段。
目前闪回查询的典型应用场景如下:
误操作修复:快速恢复因误删除或误更新导致的数据丢失。
数据恢复演练:在不影响生产环境的情况下,进行数据恢复的测试和验证。
问题诊断:通过回溯历史数据状态,帮助快速定位并解决数据库性能问题或异常。
合规审计:提供数据变更的历史记录,支持审计和法务调查需求。
作为一种数据库企业级能力,闪回查询目前在业界内有如下方案:
数据库日志逆向重做
这种方案存在一定的限制,比如通常需要要求 BINLOG 的格式为 FULL,在使用上也缺乏灵活性,另外在性能和执行效率上也并不高效。
System-Versioned Tables
该方案提供了良好的灵活性,用户可以使用 SQL 这样的方式来读取特定的历史版本数据,或者通过 SQL 直接进行数据的闪回。同时,该方案允许以表粒度的方式来控制是否需要保留历史版本数据。
然而,该方案存在的两个缺陷,导致其并没有被广泛使用:
数据库并不会负责对版本进行清理,用户需要显式清理历史版本
历史版本均保存在用户表上,查询时会扫描到许多不相关的历史版本记录,对在线业务查询会带来不容忽视的影响
Undo 方案
但相比于 System-Versioned Tables 方案,此方案的显著特点在于历史版本的物理隔离——历史版本由专有区域 Undo 维护,而当前活跃数据继续驻留在用户的在线表空间。
这种分离策略优化了资源利用,确保了主数据区的性能并减轻了由历史数据累积可能导致的负荷。历史数据的高效组织和自动生命周期管理进一步减轻了维护压力,使得用户不必手动介入数据的清理和空间回收过程。
PolarDB-X 多级闪回方案

一级闪回
一级闪回方案
过往 MySQL InnoDB 存储引擎 Undo 管理是面向在线活跃视图,并且基于 Read View 的设计无法很好地表达事务的版本信息,因此在设计上不支持闪回能力。PolarDB-X 存储引擎基于 Lizard 事务系统,通过三个组件支撑了一级闪回能力。
Lizard Transaction Slot
查询可见性取决于数据库视图以及对应记录的真实版本信息。产生该记录的事务,其版本信息由 PolarDB-X Lizard 事务引擎的 LTS 组件所维护。
Lizard Snapshot Manager
PolarDB-X Lizard 事务引擎用逻辑时间系统提交SCN号来表达本地事务提交顺序,用全局逻辑时间 GCN 来表达分布式事务的全局提交顺序。为了满足用户侧对物理时间的强诉求,PolarDB-X Lizard 事务引擎提供内部表以及打点机制来维护逻辑时间与物理时间的对应关系。
Lizard Space Manager
PolarDB-X Lizard 事务引擎接管了历史版本数据在 Undo 区域的流转,历史版本数据清理不再只取决于当前可见性,而会更多考虑未来可见性。未来可见性可以由两个维度来衡量:
时间维度
确保历史版本在某段时间范围内仍然可见,被 innodb_undo_retetion 全局参数决定
空间维度
空间有盈余的情况下,尽可能保留更多的历史版本数据,被 innodb_undo_space_reserved_size 全局参数决定
一级闪回接口
设置保留时间为 1800 秒SET GLOBAL innodb_undo_retention = 1800;
1、基于时间戳SELECT * FROM t AS OF TIMESTAMP $timestamp
2. 基于本地提交号 SCNSELECT * FROM t AS OF SCN $scn
3. 基于全局提交号 GCNSELECT * FROM t AS OF GCN $gcn
一级闪回区域维护了一段时间(如 1800s )内的所有历史版本,该区域的特点如下:
一级闪回区域内的数据被组织成版本链,通过链式回溯,调用者可以查询任意想要的版本信息
一级闪回区域占据了在线的存储空间,并使用了索引节点,因此历史版本查找非常高效且直接
一级闪回区域面向实例级别,数据库所有的修改版本均被保留
一级闪回区域具有与普通查询几乎相当的查询效率,并且保留了整库的历史版本信息。
然而,一级闪回区域作为一个实例级别的能力:
侵占了用户的在线存储空间
保留了部分的索引节点,对在线普通查询可能存在一定的影响
不具备细粒度的表级闪回管理能力。
因此其保留时间通常不宜设置过长。目前一级闪回查询,在 PolarDB-X 分布式数据库中,被广泛用于短时间内的一致性闪回查询。
二级闪回
二级闪回方案
独立区域
空间管理
表级管理
引入新类型的表:Flashback Area Table。Flashback Area Table 具备以下特点:
依托于 Lizard 事务引擎提供的灵活的控制能力,用户可以自主选择将某些表设置为 Flashback Area Table
Flashback Area 作为表的属性,其生命周期会被妥善地维护,如会被同步到备库并产生合理的效果
Flashback Area Table 的历史版本会被腾挪到二级闪回区域
Flashback Area Table 的大量索引节点会随着对应历史版本进入二级闪回区域而被清除,有效地降低了开启闪回查询后对在线常规业务的影响
二级闪回接口
创建 Flashback Area 表mysql> SET OPT_FLASHBACK_AREA = 1;mysql> CREATE TABLE t (id INT PRIMARY KEY, sec INT, KEY(sec));# 通过 INFORMATION_SCHEMA.INNODB_TABLE_STATUS 观察表属性# flashback_area 来确定是否已经正确开启该能力mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLE_STATUS;+----------------+------------------+------------------------+| SCHEMA_NAME | TABLE_NAME | options |+----------------+------------------+------------------------+| test | t1 | ...flashback_area=1... |+----------------+------------------+------------------------+
当需要进行二级闪回查询时,用户可以采用如下方式:
启动二级闪回查询mysql> SET query_via_flashback_area = 1;mysql> SELECT * FROM t1 AS OF TIMESTAMP $snapshot_gcn;+----+----+| id | c1 |+----+----+| 1 | 10 |+----+----+
二级闪回区域的历史版本保留周期脱离了 innodb_undo_retention 的设置,而使用了 innodb_txn_retention 进行设置:
设置 Flashback Area 保留时间为 7 天mysql> SET GLOBAL innodb_txn_retention = 604800;
二级闪回分析与总结
二级闪回克服了一级闪回上遇到的典型问题,具有以下优势:
面向表对象级别的管理,用户可以灵活选择
大幅度降低了在线表的索引节点
独立于一级闪回区域,历史数据可以存留足够长的时间以应对闪回查询需求
多级闪回架构优势
当前数据区域
一级闪回区域
二级闪回区域
用户可以通过标准SQL语句轻松地执行回档查询,无需关心数据实际存放的具体位置。另一方面该区域支持以表为单位进行历史数据的维护,提供了更灵活、更普适的使用手段。
闪回方案对比
空间成本
在现代数据库系统中,存储成本的分层策略普遍基于存储介质的性能指标、服务质量保证(SLA)、及其经济效益。
根据业务形态,可以划分为两类型存储服务:
业务类型 | 存储形态 | 概述 | 成本 |
业务在线储存空间 | 本地 SSD 或等同云盘 | 用于在线业务 | 每 GB 每月 0.8~1.6 |
业务离线归档空间 | OSS 存储服务等 | 用于归档或备份业务 | 每 GB 每月 0.1~0.2 |
数据库日志逆向重做
System-Versioned Tables
Undo 方案
PolarDB-X 多级闪回
性能成本
数据库日志逆向重做
System-Versioned Tables
Undo 方案
PolarDB-X 多级闪回
使用成本
数据库日志逆向重做
1)访问接口
2)空间回收
3)表级管理
支持表粒度级别的闪回,但由于日志组织通常并非按照表对象进行组织,因此在对表对象进行闪回时效率较低。
不支持表粒度级别的日志归档。
System-Versioned Tables
1)访问接口
2)空间回收
3)表级管理
Undo 方案
1)访问接口
2)空间回收
3)表级管理
PolarDB-X 多级闪回
1)访问接口
2)空间回收
3)表级管理
下表则显示了目前主流的闪回方案对比:
Flashback 方案 | 空间成本 | 易用性 | 表级粒度 | 业务表侵入 | 灵活性 | 保留时长 | 空间自管理 | 回溯耗时 |
基于数据库日志 | 低 | 低 | 有限支持 | 无 | 无灵活性 | 高 | 无 | 漫长 |
System-Versioned Tables | 高 | 高 | 支持 | 高 | 支持 SQL | 低 | 无 | 快 |
Undo | 高 | 高 | 不支持 | 高 | 支持 SQL | 中 | 有 | 快 |
PolarDB-X 多级闪回 | 中 | 高 | 支持 | 低 | 支持 SQL | 高 | 有 | 快 |




