数据库、表和索引级回收站 
=================================



查看回收站 
--------------------------

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

```sql
obclient> SHOW RECYCLEBIN;
```



开启和关闭回收站 
-----------------------------

租户创建之后，默认是开启回收站的 **，** 此时对数据库对象进行 `Truncate` / `Drop` 操作后，对象会进入到回收站。

控制回收站开启关闭的命令分为租户级别和 Session 级别：

* 租户级别的开启关闭语句

  ```sql
  obclient> SET GLOBAL `recyclebin` = on /off;
  ```

  




<!-- -->

* Session 级别的开启关闭语句

  ```sql
  obclient> SET @@recyclebin = on/off
  ```

  




恢复回收站对象 
----------------------------

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

示例如下：

* 恢复对象数据库

  ```sql
  obclient> FLASHBACK DATABASE object_name TO BEFORE DROP [RENAME TO database_name];
  ```

  




<!-- -->

* 恢复对象表

  ```sql
  obclient> FLASHBACK TABLE object_name TO BEFORE DROP [RENAME to table_name];
  ```

  




限制：

* `FLASHBACK`数据库对象的顺序需要符合从属关系，即：Database-\>Table-\> Index。

  

* MySQL 模式下恢复表会连同索引一并恢复。

  

* 通过 `PURGE` 命令可以删除表的索引，但是 `FLASHBACK` 命令不支持恢复索引。

  

* 如果一张表在进入回收站前属于某个表组，那么删除该表组后再恢复该表会导致它不属于任何一个表组。如果表组未删除，则恢复后该表还在原表组中。

  




手动清理回收站 
----------------------------

频繁删除数据库对象并重建，会在回收站产生大量数据，这些数据可以通过`PURGE` 命令清理。
**注意**



`PURGE` 操作会删除对象和从属于该对象的对象（Database-\>Table-\>Index）。

`PURGE` 操作会删除对象的元数据信息和 `__all_recyclebin` 中的记录。 执行 `PURGE` 后，在 OceanBase 数据库中将再也查不到对象的信息，真实数据也最终会被作为垃圾回收。

当一个对象的上层对象被`PURGE` ，那么当前回收站中关联的下一层对象也会被`PURGE`。

示例：

* 从回收站中物理删除指定的数据库

  ```sql
  obclient> PURGE DATABASE object_name;
  ```

  

* 从回收站中物理删除指定表

  ```sql
  obclient> PURGE TABLE object_name;
  ```

  

* 从回收站中物理删除指定索引表

  ```sql
  obclient> PURGE INDEX object_name;
  ```

  

* 清空整个回收站

  ```sql
  obclient> PURGE RECYCLEBIN;
  ```

  




自动清理回收站 
----------------------------

OceanBase 数据库当前支持通过 `recyclebin_object_expire_time`` `配置项自动 `PURGE`` `回收站中过期的 Schema 对象，其默认值为 0s。其中：

* 值为 0s 时表示关闭自动 `PURGE `回收站功能。

  

* 值为非 0s 时，表示回收一段时间前进入回收站的 Schema 对象。

  




开启自动`PURGE`回收站功能，并回收 7 天前进入回收站的 Schema 对象，示例语句如下：

```sql
obclient> ALTER SYSTEM SET recyclebin_object_expire_time = "7d";
```







