回收站从原理上来说就是一个数据字典表,用于放置用户删除的数据库对象信息,包括数据库和表等信息。用户删除的信息被放入回收站后,其实仍然占据着物理空间,除非您手动清除(PURGE )或者对象定期被数据库系统删除。

回收站支持的对象

如下表所示,在当前版本中,支持进入回收站的对象有索引、表和库。暂不支持被删除的租户进入回收站。

模式

索引(Index)

表(Table)

数据库(Database)

租户(Tenant)

MySQL

×

Oracle

×

×

×

注意

  • TRUNCATEDROP 系统表不会进入回收站。

  • 直接 TRUNCATEDROP 索引不会进入回收站。

  • 不能对回收站的对象做任何写操作(DML 或 DDL 操作),只能进行只读操作 (SELECT)。

  • 操作时需要使用租户管理账号进行操作。

查看回收站

租户管理员可以通过如下命令,查看回收站中的对象:

  1. obclient> SHOW RECYCLEBIN;

开关回收站

租户被创建后,默认回收站为开启状态此时对数据库对象进行Truncate /Drop操作后,对象会进入回收站,控制回收站开启关闭的命令分为租户级别和 Session 级别:

  • 租户级别的开启、关闭语句如下所示:

    1. obclient> SET GLOBAL `recyclebin` = ON/OFF;
  • Session 级别的开启、关闭语句如下所示:

    1. obclient> SET @@recyclebin = ON/OFF;

回收站恢复

使用FLASHBACK命令可恢复回收站中的数据库和表对象,只有租户的管理员用户才可以使用该命令。恢复时可修改对象的名称,但是不要和已有对象重名。

下述示例语句展示了如何恢复回收站中的数据库和表对象:

  • 恢复对象数据库

    1. obclient> FLASHBACK DATABASE object_name TO BEFORE DROP [RENAME TO database_name];
  • 恢复对象表

    1. obclient> 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. obclient> PURGE DATABASE object_name;
  • 从回收站中把指定表物理删除。

    1. obclient> PURGE TABLE object_name;
  • 从回收站中把指定索引表物理删除。

    1. obclient> PURGE INDEX object_name;
  • 清空整个回收站。

    1. obclient> PURGE RECYCLEBIN;