基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
库表恢复中的辅助租户机制
更新时间:2026-08-25 02:41
总结说明
OceanBase 的库表级恢复本质上仍是租户级物理恢复,需要创建辅助租户(aux_tenant)来承载整个恢复过程。恢复完成后通过 Import Table Job 将辅助租户的数据转移到目标租户,最后删除辅助租户。
详细说明
概念定义
库表级恢复是 OceanBase 提供的表级别数据恢复功能。虽然恢复粒度是单张表或单个库,但底层仍然依赖完整的租户级物理恢复基础设施。恢复过程中需要在集群中创建一个辅助租户,用于承载物理恢复和日志回放,恢复完成后辅助租户会被删除。
使用场景
- 需要将某张特定表的数据恢复到某个历史时间点(PITR - Point In Time Recovery)。
- 误删表或误改数据后的数据恢复。
- 从备份中提取特定表的数据。
使用方法
语法示例
ALTER SYSTEM RECOVER TABLE tenant.table_name UNTIL TIME = '2024-01-01 12:00:00';
核心流程
- 创建辅助租户(
aux_tenant) - 物理恢复到辅助租户
- 创建 Import Table Job
- 数据复制(
build replica) - 表切换生效(
take_effect) - 删除辅助租户
各阶段详细说明:
- 准备阶段:在目标租户中创建隐藏表(
hidden table),其 Schema 来自辅助租户中的源表。表名通常是__ddl_xxx形式的临时表。 - 获取快照:获取辅助租户源表的一致性快照版本(
snapshot_version),确保后续数据复制基于一致的数据视图。 - 数据复制:通过内部 SQL 执行跨租户数据复制,本质是高效的
INSERT /*+ append */ INTO target_hidden_table SELECT * FROM src_table。此过程使用 DDL 框架直接构建 SSTable,比普通 INSERT 更高效。 - 切换生效:将隐藏表重命名(
rename)为目标表名,切换瞬间即可使用。 - 清理:删除辅助租户,清理临时对象。
为什么要用辅助租户过渡?
1. 备份数据的格式决定了必须用租户来承载
OceanBase 的备份包含:
- Redo Log / Clog:需要回放的事务日志。
- SSTable 数据:物理存储的数据文件。
- 元数据:租户级的 Schema、配置等。
恢复过程需要:备份数据 → 日志回放(Log Replay)→ SSTable 合并(Major Compaction)→ 可用数据。
这个过程依赖完整的租户基础设施:Log Service、Meta Tenant、Storage Engine、LS(Log Stream)。单张表没有独立的 Log Service,无法完成日志回放。
2. 恢复过程需要"时间旅行"
库表恢复通常指定一个时间点(PITR),需要先从全量备份恢复数据,再回放增量日志到指定时间点。日志回放必须在独立的租户上下文中进行,否则会干扰目标租户正在进行的事务。
3. 隔离性要求
| 问题 | 辅助租户的解决方案 |
|---|---|
| 恢复过程失败 | 不影响目标租户,直接删除辅助租户 |
| 恢复期间目标租户的写入 | 辅助租户独立运行,互不干扰 |
| 恢复到不同时间点 | 辅助租户可以回放到任意时间点,目标租户继续前进 |
| 资源隔离 | 辅助租户有独立的 CPU/内存/I/O 配额 |
4. 架构复用
复用了已有的租户级恢复基础设施,避免重新实现表级恢复逻辑。
注意事项
- 恢复期间需要确保集群有足够资源创建辅助租户。
- 恢复失败时可直接删除辅助租户,不影响生产租户。
- 辅助租户恢复过程中需要独立的 CPU/内存/I/O 配额。
适用版本
OceanBase 数据库 V4.0.0 及以后版本。