首批通过分布式安全可靠测评,为关键业务系统打造
日志归档概述
更新时间:2026-04-10 11:58:35
本节主要介绍日志归档的相关概念及内部逻辑。
日志归档架构
日志归档就是将数据库产生的重做日志存储到其他介质(例如 NFS 、OSS)等,从而可以更长时间地保存数据库的所有重做历史操作记录。OceanBase 数据库是一个多租户数据库,每个租户可以独立决定是否开启日志归档功能,各租户之间的日志归档相互不影响。
同时,OceanBase 数据库也是一个原生分布式数据库,租户内各日志流之间的归档也相互独立。从单个日志流来看,归档日志由日志流 Leader 负责,每个日志仅归档一份。归档过程中,由 RS Leader 负责根据每个日志流的归档进度,计算出当前租户的归档进度。
日志归档架构如下图所示。

日志归档模式
日志归档模式分为归档( ARCHIVELOG )和非归档( NOARCHIVELOG )2 种模式,它是日志归档功能的开关,只有租户处于归档模式下才允许该租户进行日志归档任务。
归档状态
日志归档使用一个有限状态集合来描述归档目的端的归档状态,sys 租户可以通过 oceanbase.CDB_OB_ARCHIVELOG 视图的 STATUS 字段来查看;MySQL 模式下的用户租户可以通过 oceanbase.DBA_OB_ARCHIVELOG 视图的 STATUS 字段来查看,Oracle 模式下的用户租户可以通过 sys.DBA_OB_ARCHIVELOG 视图的 STATUS 字段来查看。
各归档状态及说明如下表所示。
| 状态 | 描述 |
|---|---|
| PREPARE | 开启日志归档的初始状态。 |
| BEGINNING | 开始启动日志归档。该状态下,将会通知每个日志流开始归档。 |
| DOING | 正在进行日志归档。该状态下,会不断推进日志连续位点,即 checkpoint_scn。 |
| INTERRUPTED | 归档断流。至少有一个日志流归档发生断流时,就会进入该状态。 |
| SUSPENDING | 正在暂停日志归档。 |
| SUSPEND | 日志归档已暂停。 |
| STOPPING | 正在关闭日志归档。 |
| STOP | 日志归档已停止。 |
归档日志组织
Log Group
在 OceanBase 数据库中,每一条归档日志实际上是一个日志集合,包含若干条 Log Entry,该条归档日志称之为 Log Group。每个 Log Entry 都有一个 SCN 与之关联,Log Group 也有一个 SCN,是所有 Log Entry 中最大的 SCN。 日志归档的工作就是在归档介质上管理组织 Log Group。
Piece
OceanBase 数据库按照 Piece 来组织和管理归档日志数据,一个 Piece 是某个租户连续一段时间内完备日志的集合,是一个左闭右开的区间。这里面隐含着以下两个重要特点:
一个 Piece 仅包含一段连续时间内的日志,可以是
1d,也可以是其他时间,例如2d,该时间段由LOG_ARCHIVE_DEST参数中的piece_switch_interval属性控制。一个 Piece 内的日志是完备的,意味着该租户在这一段时间内的所有日志流产生的 Log Group 都被组织在该 Piece 内。
假设 LOG_ARCHIVE_DEST 参数中的 piece_switch_interval 属性设置为 1d,那么 OceanBase 数据库每隔 1 天就会生成一个 Piece,除了每轮归档的最后一个 Piece,其他每个 Piece 内均包含了完整 1 天的日志,所有日志按照规则被归档到这个 Piece 中。例如,'2022-06-01 06:00:00.000000' 开启日志归档后,生成的完整的 Piece 包含了当前租户的日志的 SCN 的范围是 ['2022-06-01 06:00:00.000000' , '2022-06-02 06:00:00.000000')。
Piece 的几个重要属性
Piece 有 START_SCN、END_SCN、CHECKPOINT_SCN、STATUS 和 FILE_STATUS 等几个重要属性。
START_SCN
START_SCN 字段用于描述 Piece 中连续日志的起点 SCN。
END_SCN
END_SCN 字段用于描述 Piece 的结束 SCN,END_SCN - START_SCN 的值即是 piece_switch_interval 的属性值。
例如,LOG_ARCHIVE_DEST 参数中的 piece_switch_interval 属性设置为 1d,开启归档的时间是 2022-06-01 06:00:00。那么,该轮归档产生的第 1 个 Piece 的 START_SCN 是 '2022-06-01 06:00:00',END_SCN 是 '2022-06-02 06:00:00',表示所有大于等于 '2022-06-01 06:00:00',而小于 '2022-06-02 06:00:00' 的 Log Group 都要归档在这个 Piece 中。 第 2 个 Piece 的 START_SCN 是 '2022-06-02 06:00:00',END_SCN 是 '2022-06-03 06:00:00'。
在同一轮归档周期中,SCN 在 [START_SCN, END_SCN) 范围内的 Log Group 都归属于同一个 Piece,而 SCN 在 [START_SCN, END_SCN) 范围内的 Log Entry 则不一定归属于同一个 Piece。
例如,Piece 1 的 [START_SCN, END_SCN) 是 ['2022-06-01 06:00:00', '2022-06-02 06:00:00'),Log Group 中有2个 Log Entry,SCN 分别是 '2022-06-02 05:59:59' 和 '2022-06-02 06:00:01' , 该 Log Group 的 SCN 是这2个 Log Entry 中最大的 SCN,因此是 '2022-06-02 06:00:01',但归属于下一个 Piece。
CHECKPOINT_SCN
CHECKPOINT_SCN 字段用于描述 Piece 中连续日志的最大 SCN,是该 Piece 所有 Log Group 中的最大 SCN,所有 SCN 在 [START_SCN, CHECKPOINT_SCN] 范围内的 Log Group 都已经被归档在该 Piece 中。
STATUS
STATUS 字段用于描述 Piece 的状态,各状态及说明如下表所示。
| 状态 | 描述 |
|---|---|
| ACTIVE | 活动的 Piece,表示系统正在向这个 Piece 内归档日志 |
| FROZEN | 冻结的 Piece,表示该 Piece 内的日志是完整的,不会再向这个 Piece 内归档日志 |
FILE_STATUS
FILE_STATUS 用于描述 Piece 的文件状态,各状态及说明如下表所示。
| 字段 | 描述 |
|---|---|
| AVAILABLE | Piece 内数据是完备的,并且是完整的,既没有被清理,也没有损坏 |
| INCOMPLETE | Piece 内数据不是完备的,缺少了某些日志流的数据 |
| DELETING | 过期正在被清理的 Piece。 |
| DELETED | Piece 已被清理 |
| BROKEN | Piece 内数据已损坏 |