关于OceanBase 数据库数据库对象进入回收站机制的相关问题。

本文主要介绍数据库、表等数据库对象进入回收站的机制。

适用版本

OceanBase 数据库所有版本。

回收站原理

目前,在 OceanBase 数据库中,能进入回收站的对象包括数据库、表、索引和租户。他们之间有一定的从属关系。本文主要介绍数据库、表等数据库对象进入回收站的机制。有关租户进入回收站的机制,请参见 OceanBase 数据库中租户进入回收站机制

注意所有的回收站操作都需要 root 权限。

有两个回收站相关的系统变量:recyclebin 和 ob_enable_truncate_flashback。

其中,recyclebin 变量用于控制回收站是否开启,默认为 1,表示开启回收站。ob_enable_truncate_flashback 变量只对 TRUNCATE TABLE 生效。

在 OceanBase 数据库中,TRUNCATE TABLE 通过两步完成:

  1. 通过 DROP TABLE 语句将表删除,同时也会删除从属该表的索引。
  2. 通过 CREATE TABLE 语句创建和原来结构相同的表。同时也会创建和原来相同的索引。

ob_enable_truncate_flashback 主要决定第一步 DROP TABLE 时,表和索引是否进入回收站。ob_enable_truncate_flashback 默认为 on,表示用户执行删除操作的对象会进入回收站。

有关以上两个参数的详细信息,请参见《OceanBase 数据库 参考指南》中的 系统变量 章节。

每个租户都拥有一个回收站表,用于记录当前租户放入到回收站的对象信息,该表只对租户下的 root 用户可见。可以通过以下语句查看回收站中的对象:

obclient> SHOW RECYCLEBIN;

回收站有两重要的属性,OBJIECT_NAME 和 ORIGINAL_NAME。

  • OBJIECT_NAME 表示被删除的对象在回收站的对象名。
  • OBJECT_NAME 的生成规则为 OBJECT_NAME = __recycle_$ORIGINAL_ID。
  • ORIGINAL_NAME 表示对象原来的名字,如原来的表名、索引名等。
  • 此外,TYPE 列表示对象原来的类型,如 TABLE、INDEX、DATABASE 等。每个进入回收站的对象都会在表中增加一条记录;每个对象退出回收站后,会删除其在表中的记录。

回收站的 PURGE 操作

PURGE 用来将回收站中的对象删除。经过 PURGE 操作以后,回收站会被清空,即其中的数据库对象会被彻底删除。PURGE 操作也需要考虑从属关系,如 PURGE TABLE 时也会将 TABLE 对应的索引删除;与 FLASHBACK 不同,PURGE 允许直接删除索引。PURGE 相关的操作包括:

  • 从回收站物理删除指定索引表。

obclient> PURGE DATABASE object_name;

  • 从回收站物理删除指定表。

obclient> PURGE TABLE object_name;

  • 清空整个回收站 。

obclient> PURGE RECYCLEBIN;

回收站的 FLASHBACK 操作

FLASHBACK 用来恢复回收站的对象,恢复对象时,也会将从属它的对象恢复。例如恢复表时,建立在表上的索引也会被恢复。如果表在回收站中,不允许直接 FLASHBACK 建立在表上的索引。恢复的对象主要有数据库、表与索引,语法如下:

其中 RENAME TO 子句用于将 FLASHBACK 的数据库对象重命名。

  • 还原回收站中的表。
  • 其中 db_name 表示库名,可以将表 FLASHBACK 到一个新的库中。

obclient> FLASHBACK TABLE object_name TO BEFORE DROP [RENAME TO db_name.table_name];

  • 还原回收站中的数据库。

obclient> FLASHBACK DATABASE object_name TO BEFORE DROP [RENAME TO db_name];

  • 还原回收站中的索引。
  • 目前不支持索引重命名。

obclient> FLASHBACK INDEX OBJIECT_NAME TO BEFORE DROP;

回收站使用约束

在使用 OceanBase 数据库的回收站时,需要注意以下几点约束:

  • 对于有从属关系的对象,FLASHBACK 操作不能破坏从属关系,恢复对象时,也会将从属它的对象恢复,如恢复表时,表上的索引也会被恢复。但如果表在回收站中,直接 FLASHBACK 相应的索引是不允许的。而 PURGE 操作可以破坏从属关系。
  • 如果一个表属于某个表组,在删除表,再删除该表组后,FLASHBACK TABLE 会导致该表不属于任何一个表组;如果仅删除表,则 FALSHBACK 操作后,表还是属于该表组。
  • 执行 DROP INDEX 语句后,会将索引设置为 INVISIBLE 。如果该索引是 UNIQUE 索引,则在执行 DROP INDEX 时会去除其 UNIQUE 属性。
  • 不能对回收站的对象做任何写操作(包括 DDL 或 DML),只能对回收站的对象执行读操作(即仅允许 SELECT 语句)。

注意,

  • 社区版当前版本(3.1)不支持回收站中的表闪回操作。
  • 开启回收站后,回收站中的对象也会占用一个分区名额。如果业务频繁的drop table 或 truncate table,会导致回收站中临时对象很多。早期版本 2.2.7 版本每个节点observer可容纳的分区数建议在 5w以内。3.1 也是。后期会将这个能力提升到10w以上。回收站中对象尽量清理掉。可以通过参数
    recyclebinobjectexpire_time 来自动清理超期的回收站临时对象。