OB数据库 V2.X 版本的快照功能是什么?

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

使用方式

  1. 创建测试表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)

  1. 创建还原点。

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)

  1. 修改数据,将指定行的 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)

  1. 测试还原点,其中 AS OF 子句用于指定还原点的 SCN 号。
  2. 发现还原点会存储指定 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 语句:

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