租户级回收站 
===========================



除了支持 `DATABASE`、`TABLE`、`INDEX` 等类型的回收站对象外，当前 OceanBase 数据库还支持租户级的回收站对象。

系统租户不会被执行 DROP 操作，租户级回收站的管理主要由系统租户来完成，系统租户通过执行各类回收站相关的命令来完成对租户级回收站的管理。

租户级的回收站对象仅可能出现在系统租户下。

对于租户级的回收站对象：

* `DROP TENANT` 是将租户名称变更为统一的回收站中的格式，租户实际占用的空间并没有释放，只是不能再向该租户建立新的连接。

  

* 执行 `FLASHBACK` 时，可以使用租户原始的名称，也可以使用回收站中的名称，回收站中的名称全局唯一，因此使用回收站中的名称，可以明确恢复的是哪个租户。当多个租户存在相同的原始名称时，此时恢复的租户是这些租户中最后进入回收站中的租户。

  

* 执行 `PURGE TENANT` 时，同样可以使用原始名称和回收站中的名称。与 `FLASHBACK` 不同，`PURGE TENANT` 时，如果多个原始名称相同，则删除的是最早进入回收站中的租户。

  




查看回收站功能 
----------------------------

在系统租户下使用 `SHOW RECYCLEBIN` 语句，可以查看当前系统租户 Recyclebin 中的回收站功能。

示例如下：

```sql
obclient> SHOW RECYCLEBIN;
+--------------------------------+----------------+----------+----------------------------+
| OBJECT_NAME                    | ORIGINAL_NAME  | TYPE     | CREATETIME                 |
+--------------------------------+----------------+----------+----------------------------+
| __recycle_$_1_1600136460199936 | wendo_table    | TABLE    | 2020-09-15 10:21:00.207886 |
| __recycle_$_1_1600136479664128 | wendo_database | DATABASE | 2020-09-15 10:21:19.664534 |
| __recycle_$_1_1600135793000960 | mysql          | TENANT   | 2020-09-15 10:23:25.773877 |
+--------------------------------+----------------+----------+----------------------------+
3 rows in set (0.21 sec)
```



其中，`OBJECT_NAME` 是在回收站中的名称；`ORIGINAL_NAME` 是原始名称。

示例中，`mysql` 即为一个租户类型的回收站对象。

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

在系统租户下使用 `SET` 语句，可以开启和关闭系统租户的 Recyclebin 功能。

示例如下：

* 开启回收站功能

  ```sql
  obclient> SET GLOBAL recyclebin=true;
  Query OK, 0 rows affected (0.01 sec)
  ```

  




<!-- -->

* 关闭回收站功能

  ```sql
  obclient> SET GLOBAL recyclebin=true;
  Query OK, 0 rows affected (0.01 sec)
  ```

  




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

当系统租户的回收站功能开启时，执行 `DROP TENANT` 操作后，相应的租户默认会进入回收站。您可以使用 `FLASHBACK` 语句将回收站内的租户恢复为正常租户。

示例如下：

* 将系统租户回收站中的 `tenant_name` 闪回为正常租户。

  ```sql
  obclient> FLASHBACK TENANT <tenant_name> TO BEFORE DROP;
  ```

  




<!-- -->

* 将系统租户回收站中的 `tenant_name` 闪回为正常租户，并重命名 `new_tenant_name`。

  ```sql
  obclient> FLASHBACK TENANT <tenant_name> TO BEFORE DROP RENAME TO <new_tenant_name>;
  ```

  




清理回收站 
--------------------------

系统租户执行 Purge 操作，可以将回收站中的对象彻底删除。

* 将租户 `tenant_name` 从回收站中彻底清除。

  ```sql
  obclient> PURGE TENANT tenant_name;
  ```

  




<!-- -->

* 将回收站中的全部对象全部彻底清除。

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

  
  **说明**

  

  对于主备库场景：
  * 备库中禁止自动发起 `DROP TENANT`、`DROP TENANT FORCE`、`DROP TENANT PURGE`、`FLASHBACK TENANT`、`PURGE TENANT` 等操作，所有这些操作都需要从主库中同步。

    
  
  * 支持对备库执行 `PURGE RECYCLEBIN` 操作，但不支持其将回收站中的 `TENANT` 类型删除。

    
  

  
  



