物理备份与恢复概述 
==============================



概述 
-----------------------

备份恢复是 OceanBase 数据库高可用特性的核心组件，主要用于保障数据的安全，包括预防存储介质损坏和用户的错误操作等。如果存储介质损坏或者用户误操作而导致了数据丢失，可以通过恢复的方式恢复用户的数据。

目前 OceanBase 数据库支持 OSS、NFS 和 COS 三种备份介质，提供了备份、恢复、管理三大功能。

OceanBase 数据库从 V2.2.52 版本开始支持集群级别的物理备份。物理备份由基线数据、日志归档数据两种数据组成，因此物理备份由日志归档和数据备份两个功能组合而成：

* 日志归档是指日志数据的自动归档功能，OBServer 会定期将日志数据归档到指定的备份路径。这个动作是全自动的，不需要外部定期触发。

  

* 数据备份指的是备份基线数据的功能，该功能分为全量备份和增量备份两种：

  * 全量备份是指备份所有的需要基线的宏块。

    
  
  * 增量备份是指备份上一次备份以后新增和修改过的宏块。

    
  

  




OceanBase 数据库支持租户级别的恢复，恢复是基于已有数据的备份重建新租户的过程。用户只需要一个 `alter system restore tenant` 命令，就可以完成整个恢复过程。恢复过程包括租户系统表和用户表的 Restore 和 Recover 过程。Restore 是将恢复需要的基线数据恢复到目标租户的 OBServer，Recover 是将基线对应的日志恢复到对应 OBServer。

OceanBase 数据库目前支持手动删除指定的备份和自动过期备份的功能。

物理备份架构 
---------------------------

OceanBase 数据库物理备份的架构如下图所示。![备份架构](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5307748161/p264263.png)当用户用系统租户登录到备份集群以后，需要先用 SQL 发起日志归档，等日志归档发起完成启动阶段以后，才可以发起基线备份。

日志归档是定期备份到备份目的端的，只需要用户发起一次 `alter system archivelog`，日志备份就会在后台持续进行。日志归档是由每个 PG（PartitionGroup）的 Leader 负责定期将该 PG 的日志归档到备份介质指定的路径，RS（RootService）负责定期统计日志归档的进度，并更新到内部表。

数据备份是需要用户触发的，比较常见的场景是周六触发一次全量备份，周二和周四触发一次增量备份。当用户发起数据备份请求时，该请求会首先被转发到 RS 所在的节点上；RS 会根据当前的租户和租户包含的 PG 生成备份数据的任务，然后把备份任务分发到 OBServer 上并行地执行备份任务；OBServer 负责备份 PG 的元信息和宏块到指定的备份目录，宏块按照 PG 为单位进行管理。

OceanBase 数据库目前支持使用 OSS、NFS 和 COS 三种文件系统作为备份的目的地。以下是备份功能在备份目的地创建的目录结构以及每个目录下保存的文件类型。

```unknow
backup/ # 备份的根目录
└── ob1 # cluster_name
  └── 1 # cluster_id
      └── incarnation_1 #分身 ID
          ├── 1001 # 租户id
          │   ├── clog # Clog 的根目录
          │   │   ├── 1 # Clog 备份的 Round ID
          │   │   │   ├── data # 日志的数据目录
          │   │   │   └── index # 日志的索引目录
          │   │   └── tenant_clog_backup_info # 日志备份的元信息，按照 Round ID 分段记录
          │   └── data # 数据的根目录
          │       ├── backup_set_1 # 全量备份的目录
          │       │   ├── backup_1 # 差异备份的目录，第一个差异备份目录是全量的 Meta    
          │       │   ├── backup_2 # 差异备份的目录。第二个差异备份的目录，Meta 也是全量备份的。
          │       │   ├── backup_set_info # 记录了 backup_set 目录内的多次差异备份的信息
          │       │   └── data #宏块数据的目录，包含了所有的全量和差异的宏块
          │       └── tenant_data_backup_info # 记录了租户全部的数据备份信息
          ├── clog_info # server启动日志备份的信息
          │   └── 1_10.10.10.1_12533 # 一个 Server 一个启动日志备份信息
          ├── cluster_clog_backup_info # 集群级别的日志备份信息
          ├── cluster_data_backup_info # 集群级别的数据备份信息
          ├── tenant_info # 租户的信息
          └── tenant_name_info #租户 Name 和 ID 的影射关系
```



物理恢复架构 
---------------------------

OceanBase 数据库的物理恢复架构如下图所示。![恢复架构](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5307748161/p264265.png)对于用户可见的流程主要有两步：

1. 在目的集群上用 `CREATE RESOURCE POOL `命令建立恢复租户需要的资源池。

   

2. 通过 `ALTER SYSTEM RESTORE TENANT` 命令调度租户恢复任务。

   对于备份恢复来说，`RESTORE TENANT` 命令的内部流程如下：
   1. 创建恢复用的租户。

      
   
   2. 恢复租户的系统表数据。

      
   
   3. 恢复租户的系统表日志。

      
   
   4. 调整恢复租户的元信息。

      
   
   5. 恢复租户的用户表数据。

      
   
   6. 恢复租户的用户表日志。

      
   
   7. 恢复扫尾工作。

      对于单个 PG 来说，恢复的流程就是将 PG 的元信息和宏块数据拷贝到指定的 OBServer，构建出一个只有基线数据的 PG；然后再把 PG 的日志拷贝到指定的 OBServer，回放到该 PG 的 MemTable 中。这个流程中如果日志的量比较大，可能会触发转储操作。
      
   

   



