回收站用来存储被删掉的信息,它用来存储用户删除掉的数据库和表等信息。回收站在原理上说就是一个数据字典表,放置用户删掉的数据库对象信息。用户删除掉的东西被放入回收站,其实仍然占据着物理空间,除非您手动进行清除( PURGE
)或者对象定期被数据库系统删除。
OceanBase 1.0 时就实现了回收站功能,在 2.0 上又新增了的 Oracle 模式且支持了部分对象。
回收站支持的对象
如下表所示可以进入回收站的对象有索引、表和库。被删除的租户是无法进入回收站的.。
模式 | 索引(Index) | 表(Table) | 数据库(Database) | 租户(Tenant) |
MySQL | ✅ | ✅ | ✅ | ❌ |
Oracle | ❌ | ✅ | ❌ | ❌ |
注意:
TRUNCATE
或DROP
系统表不会进入回收站。- 直接
TRUNCATE
或DROP
索引不会进入回收站。- 不能对回收站的对象做任何写操作(DML 或 DDL 操作),只能进行只读操作 (
SELECT
)。- 操作时需要使用租户管理账号进行操作。
查看回收站
租户管理员可以通过如下命令,查看回收站中的对象:
show recyclebin;
开关回收站
租户创建之后,默认是开启回收站的,此时对数据库对象进行 Truncate
/ Drop
操作后,对象会进入到回收站,控制回收站开启关闭的命令分为租户级别和 Session 级别:
- 租户级别的开启关闭语句如下所示:
set global `recyclebin` = on /off;
- Session 级别的开启关闭语句如下所示:
set @@recyclebin = on/off
回收站恢复
使用 FLASHBACK
命令可恢复回收站中的数据库和表对象,只有租户的管理员用户才可以使用该命令。恢复时可对修改对象的名称,但是不要和已有对象重名。下述示例语句展示了如何恢复回收站中的数据库和表对象:
--恢复对象数据库
FLASHBACK DATABASE object_name TO BEFORE DROP [RENAME TO database_name];
--恢复对象表
FLASHBACK TABLE object_name TO BEFORE DROP [RENAME to table_name];
限制:
FLASHBACK
数据库对象的顺序需要符合从属关系,即:Database->Table-> Index。- Oracle 模式下恢复表不会处理恢复其中的索引,即索引需要重建。
- MySQL 模式下恢复表会连同索引一并恢复。
- 通过
PURGE
命令可以删掉表的索引,但是FLASHBACK
命令不支持恢复索引。 - 如果一张表在进回收站之前属于某个表组,那么删除该表组后再恢复改表会导致它不属于任何一个表组。如果表组还在那恢复后该表还在原表组中。
回收站清理
频繁删除数据库对象并重建,会在回收站产生大量数据,这些数据可以通过 PURGE
命令清理。需要注意的是,`PURGE` 操作会删除对象和从属于该对象的对象(Database->Table->Index)。
PURGE
操作会删除对象的元数据信息和 __all_recyclebin
中的记录。 执行 PURGE
后,在 OceanBase 中将再也查不到对象的信息,真实数据也最终会被垃圾回收。
当一个对象的上层对象被 PURGE
,那么当前回收站中关联的下一层对象也会被 PURGE
。
下述示例展示了一些如何通过 PURGE
命令清理回收站中的数据:
示例 1:
下述语句展示了如何从回收站把指定库物理删除:
PURGE DATABASE object_name;
示例 2:
下述语句展示了如何从回收站中把指定表真正物理删除:
PURGE TABLE object_name;
示例 3:
下述语句展示了如何从回收站中把指定索引表真正物理删除:
PURGE INDEX object_name;
示例 4:
下述语句展示了如何清空整个回收站:
PURGE RECYCLEBIN;