本文主要介绍数据库、表等数据库对象进入回收站的机制。
适用版本
OceanBase 数据库所有版本。
回收站原理
目前,在 OceanBase 数据库中,能进入回收站的对象包括数据库、表、索引和租户。他们之间有一定的从属关系。本文主要介绍数据库、表等数据库对象进入回收站的机制。有关租户进入回收站的机制,请参见 OceanBase 数据库中租户进入回收站机制。
注意所有的回收站操作都需要 root 权限。
有两个回收站相关的系统变量:recyclebin 和 ob_enable_truncate_flashback。
其中,recyclebin 变量用于控制回收站是否开启,默认为 1,表示开启回收站。ob_enable_truncate_flashback 变量只对 TRUNCATE TABLE 生效。
在 OceanBase 数据库中,TRUNCATE TABLE 通过两步完成:
- 通过 DROP TABLE 语句将表删除,同时也会删除从属该表的索引。
- 通过 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 语句)。