首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库 V2.X 版本的快照功能介绍
更新时间:2026-05-09 08:26
本文介绍 OceanBase 数据库的快照功能。
适用版本
OceanBase 数据库 V2.X 及后续版本。
实现方式
OceanBase 数据库实现了类似 Oracle 数据库的快照功能,用户可以指定保留当前时刻的数据快照,并在之后指定在这个数据快照上执行查询请求。
OceanBase 数据库支持通过 SQL 命令查看当前存在的还原点、删除或者新增还原点,用户设置的还原点对应的内部数据快照会在转储后保留。
OceanBase 数据库使用内部表 __all_acquired_snapshot 来存储还原点,并添加视图V$RESTORE_POINT 用以直接展示用户创建的 Restore Point。为了解决保留大量多版本数据的问题,需要将还原点依赖的 SSTable 单独存储,以供还原点使用。因此 OceanBase 数据库独立出来一个 Partition Group 级别的新结构 ObBackUpMetaDataMgr 来专门保存备份和还原点需要的历史版本的 SSTable。
OceanBase 数据库的快照功能的逻辑流程如下:
在执行
CREATE RESTORE命令后,OBServer 取当前 GTS,向__all_acquired_snapshot内部表中记录这个GTS值和还原点的名字,就可以给客户端返回创建成功。此后系统可以保证在转储时 GTS 的多版本数据一定保留,该还原点可以查询。后台线程定期扫描
__all_aquired_snapshot,如果发现有还原点,则检查ObBackUpMetaDataMgr中是否包含用于查询该还原点的 SSTable,如果没有就需要去 TableStore 里取相应的 SSTable,加入到ObBackUpMetaDataMgr中。此后再发生转储时,计算 kept_multi_version_start 不再考虑还原点。用户在查询还原点的数据时,OceanBase 数据库会先从 TableStore 中找能够满足这次查询的 SSTable,如果没有,再去
ObBackUpMetaDataMgr中查询。用户删除还原点时,OceanBase 数据库会从
__all_acquired_snapshot中删除还原点的记录。后台线程会将现在有的还原点传给ObBackUpMetaDataMgr,如果发现有某个还原点的 SSTable,但__all_acquired_snapshot表里已经没有这个还原点,就会将 SSTable回收。
使用方式
创建测试表 test,向测试表中插入数据,数值为 999999。
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)创建还原点。
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)修改数据,将指定行的
SALARY列值修改为 1000000。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> commit; Query OK, 0 rows affected (0.00 sec) obclient> SELECT * FROM test; +------+---------+ | NAME | SALARY | +------+---------+ | ma | 1000000 | +------+---------+ 1 row in set (0.01 sec)测试还原点,其中
AS OF子句用于指定还原点的 SCN 号。发现还原点会存储指定 SCN 号的数据。
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 语句。
在表上创建索引
为表增加或删除分区
修改列类型、长度或默认值
添加或删除列
表上添加或删除约束