---
title: OceanBase 数据库 V2.X 版本的快照功能介绍 -OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于OceanBase 数据库 V2.X 版本的快照功能介绍 相关的常见问题和使用技巧，帮助您快速解决OceanBase 数据库 V2.X 版本的快照功能介绍 的难题。
---
切换语言

- 简体中文
- English

划线反馈

# OceanBase 数据库 V2.X 版本的快照功能介绍

更新时间：2026-05-09 08:26

适用版本： V2.1.x、V2.2.x、V3.1.x、V3.2.x 内容类型：TechNote  

本文介绍 OceanBase 数据库的快照功能。

## 适用版本

OceanBase 数据库 V2.X 及后续版本。

## 实现方式

OceanBase 数据库实现了类似 Oracle 数据库的快照功能，用户可以指定保留当前时刻的数据快照，并在之后指定在这个数据快照上执行查询请求。

OceanBase 数据库支持通过 SQL 命令查看当前存在的还原点、删除或者新增还原点，用户设置的还原点对应的内部数据快照会在转储后保留。

OceanBase 数据库使用内部表 `__all_acquired_snapshot` 来存储还原点，并添加视图`V$RESTORE_POINT` 用以直接展示用户创建的 Restore Point。为了解决保留大量多版本数据的问题，需要将还原点依赖的 SSTable 单独存储，以供还原点使用。因此 OceanBase 数据库独立出来一个 Partition Group 级别的新结构 `ObBackUpMetaDataMgr` 来专门保存备份和还原点需要的历史版本的 SSTable。

OceanBase 数据库的快照功能的逻辑流程如下：

1. 在执行 `CREATE RESTORE` 命令后，OBServer 取当前 GTS，向 `__all_acquired_snapshot` 内部表中记录这个GTS值和还原点的名字，就可以给客户端返回创建成功。此后系统可以保证在转储时 GTS 的多版本数据一定保留，该还原点可以查询。
 2. 后台线程定期扫描 `__all_aquired_snapshot`，如果发现有还原点，则检查 `ObBackUpMetaDataMgr` 中是否包含用于查询该还原点的 SSTable，如果没有就需要去 TableStore 里取相应的 SSTable，加入到 `ObBackUpMetaDataMgr` 中。此后再发生转储时，计算 kept_multi_version_start 不再考虑还原点。
 3. 用户在查询还原点的数据时，OceanBase 数据库会先从 TableStore 中找能够满足这次查询的 SSTable，如果没有，再去 `ObBackUpMetaDataMgr` 中查询。
 4. 用户删除还原点时，OceanBase 数据库会从 `__all_acquired_snapshot` 中删除还原点的记录。后台线程会将现在有的还原点传给 `ObBackUpMetaDataMgr`，如果发现有某个还原点的 SSTable，但`__all_acquired_snapshot` 表里已经没有这个还原点，就会将 SSTable回收。

## 使用方式

1. 创建测试表 test，向测试表中插入数据，数值为 999999。

   ```unknow
   obclient> CRAETE TABLE test (name varchar2(10),salary number);
   Query OK, 0 rows affected (0.03 sec)

   obclient> ALTER SESSION SET nls_date_format='YYYY-mm-DD hh24:mi:ss';
   Query OK, 0 rows affected (0.00 sec)

   obclient> INSERT INTO test VALUES ('ma',999999);
   Query OK, 1 row affected (0.01 sec)

   obclient> COMMIT;
   Query OK, 0 rows affected (0.00 sec)

   ```
 2. 创建还原点。

   ```unknow
   obclient> CREATE RESTORE POINT rp1;
   Query OK, 0 rows affected (0.01 sec)
   obclient> SELECT sysdate FROM dual;
   +---------------------+
   | SYSDATE             |
   +---------------------+
   | 2021-02-25 19:50:40 |
   +---------------------+
   1 row in set (0.00 sec)

   ```
 3. 修改数据，将指定行的 `SALARY` 列值修改为 1000000。

   ```unknow
   obclient> UPDATE test SET salary=1000000 where name='ma';
   Query OK, 1 row affected (0.01 sec)
   Rows matched: 1  Changed: 1  Warnings: 0

   obclient> SELECT * FROM test;
   +------+---------+
   | NAME | SALARY  |
   +------+---------+
   | ma   | 1000000 |
   +------+---------+
   1 row in set (0.01 sec)

   ```
 4. 测试还原点，其中 `AS OF` 子句用于指定还原点的 SCN 号。

   发现还原点会存储指定 SCN 号的数据。

   ```unknow
   obclient> SELECT * FROM V$RESTORE_POINT;
   +-----------+------------------+----------------------------+-------+
   | TENANT_ID | SCN              | TIME                       | NAME  |
   +-----------+------------------+----------------------------+-------+
   |      1001 | 1614260844800790 | 2021-02-25 21:47:24.801894 | RP1   |
   +-----------+------------------+----------------------------+-------+
   1 row in set (0.00 sec)

   obclient> SELECT * FROM test AS OF scn '1614260844800790';
   +------+---------+
   | NAME | SALARY  |
   +------+---------+
   | ma   | 999999 |
   +------+---------+
   1 row in set (0.00 sec)

   ```

## 已知问题

在创建还原点后，不能在创建还原点前就存在的表上执行 DDL 语句。

- 在表上创建索引
 - 为表增加或删除分区
 - 修改列类型、长度或默认值
 - 添加或删除列
 - 表上添加或删除约束

Previous

[OceanBase 数据库的 GC 回收处理机制](https://www.oceanbase.com/knowledge-base/oceanbase-database-20000000147)

Next

[OceanBase 数据库 V4.0 版本容灾问题排查（RS 相关）](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000001229179) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
