
# 库表回收站
#### 操作场景
由于DDL操作无法回滚，如果您误删除表或数据库，可能会导致数据丢失。TaurusDB支持库表回收站功能，删除后暂时将指定表或数据库移入"__recyclebin__"库中，并将表或数据库重命名。支持修改被删除的库表在回收站中的保留时间，您也可以随时将库表从回收站中恢复或彻底删除。
回收站中的库表将占用实例的存储空间，直到系统自动清理。如需提前释放，请手动清理回收站中的库表。
#### 前提条件
- 版本限制 库表回收站功能仅支持如下版本，内核版本的查询方法请参见[如何查看云数据库 TaurusDB实例的版本号](https://support.huaweicloud.com/taurusdb_faq/taurusdb_faq_0141.html)。
  - 内核版本为2.0.57.240900及以上时支持DROP TABLE语句使用库表回收站功能，
  
  - 内核版本为2.0.63.250300及以上时，支持DROP TABLE、DROP DATABASE、TRUNCATE TABLE使用库表回收站功能。
   
- 权限控制
  "__recyclebin__"作为回收站临时存放被删除表的数据库，不允许对回收站中的表进行修改或删除。如需查看、恢复或者清理回收站中的表，可以通过回收站功能提供的命令对"__recyclebin__"下的表进行操作，并且操作账号需要同时对回收站中的表或恢复的目标表具有相应的操作权限，才可以进行操作，具体权限要求如下：
  - 查看回收站中表的信息：对"__recyclebin__"中表的SELECT权限。
  
  - 清理回收站中指定表：对"__recyclebin__"中表的DROP权限。
  
  - 恢复回收站中指定表：对"__recyclebin__"中表的ALTER、DROP权限，以及对恢复的目标表的CREATE、INSERT权限。
    
 
#### 原理介绍
#### 命名规则
- **2.0.57.240900≤内核版本\<2.0.63.250300**
  **命名规则：** __\<*storage_engine_name* \>_\<*db_name* \>_\<*table_name* \>_\<*id*\>
  **约束限制：** 如果\<*db_name* \>或\<*table_name* \>长度超过10个字符，将截取前10个字符并拼接到回收站表的表名中，并在\<*id* \>后增加"_"字符表示原库名或原表名被截断。
  表1参数解释 
  | 参数                    | 解释                                      |
  |:---|:---|
  | *storage_engine_name* | 当前仅支持InnoDB引擎。                          |
  | *db_name*             | 原数据库名称。                                 |
  | *table_name*          | 原表名称。                                   |
  | *id*                  | 回收站系统自动生成的唯一ID，保证相同表名的表被移入回收站后表名不会出现重复。 |
     
  
- **内核版本 ≥ 2.0.63.250300**
  **命名规则：** \<*db_name* \>@\<*table_name* \>@\<*id*\>
  **约束限制：**
  - 1秒内仅允许在回收站中保存同库名同表名的1个版本，1秒内多次回收同库名同表名的表，后续操作将等待1秒后执行。
  
  - 回收站中生成的表名需满足MySQL命名规则，如原库名表名长度过长，生成的表名超过MySQL表名最长长度，则对该表执行DROP TABLE、DROP DATABASE、TRUNCATE TABLE语句会直接删除表，而不会移入回收站。
  
  - 如果DROP TABLE、DROP DATABASE、TRUNCATE TABLE语句操作的表库名或表名中包含@符号，则执行后不会进入回收站，会直接删除。
  
  
  表2参数解释 
  | 参数           | 解释                                      |
  |:---|:---|
  | *db_name*    | 数据库名称。                                  |
  | *table_name* | 表名称。                                    |
  | *id*         | 回收站系统自动生成的唯一ID，保证相同表名的表被移入回收站后表名不会出现重复。 |
     
  
 
#### 回收机制
创建或者升级到大于等于2.0.57.240900的实例时，TaurusDB会初始化一个名为"__recyclebin__"的数据库。[开启库表回收站]后，执行DROP TABLE、DROP DATABASE、TRUNCATE TABLE语句不会直接删除表或数据库，而是暂时将指定表或数据库移入"__recyclebin__"库中，并将表或数据库重命名。
表被移入回收站后，表的触发器和外键将被彻底删除，无法恢复。
#### 清理机制
- 系统自动清理：开启后台自动清理功能后，实例主节点将创建后台清理线程，自动清理达到最大保存时间（rds_recycle_bin_retention）的表，默认保存3天。系统自动清理的表将被彻底删除，无法恢复。 后台自动清理任务在RegionLessDB集群的从实例中不会执行自动清理。
  
- 手动清理：执行purge命令，手动清理回收站中的表。执行清理命令后，表将被彻底删除，无法恢复。
 
#### 约束与限制
- 如果TaurusDB实例内核版本低于2.0.57.240900，且用户手动创建了名为"__recyclebin__"的数据库，则实例升级到2.0.57.240900及以上版本时，可能出现升级预检查失败。请手动删除"__recyclebin__"数据库后重新升级。如需继续保留用户创建的"__recyclebin__"数据库作为普通数据库进行使用，请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)。
- 如果被删除的表为回收站不支持的类型，则DROP TABLE语句将直接删除指定表，而不会将表移入回收站。
- 如果实例打开回收站功能，短时间内删除有同名约束的表，可能会因为"__recyclebin__"数据库下存在同名约束导致移入回收站失败。如果移入回收站失败，请检查被删除的表是否存在约束，删除约束后重新执行DROP TABLE语句进行删除。
- 当回收站功能启用时，DROP TABLE/DROP DATABASE/TRUNCATE TABLE语句内存消耗相比直接删除会有上升，内存消耗和单条RENAME TABLE语句操作多张表基本相同。单条语句删除表数量过多时，可能出现OOM。如用户业务需要单条语句删除大量表，且开启回收站功能后易出现OOM，请使用回收站session级开关rds_recycle_bin_mode控制跳过此类业务。
- 表回收站功能仅支持普通InnoDB表，不支持共享表空间、全文索引、临时表、非InnoDB表、存在Secondary Engine的表、系统表、隐藏表。
- 表回收站功能不支持在function、procedure、trigger、event中执行的删表或删库语句。
- 暂不支持多租户实例的普通租户使用库表回收站功能。
- 使用冷热分离功能归档回收站中的表后，无法使用回收站命令清理或恢复归档的表。
- 部分备份恢复场景如表级时间点恢复，不会恢复回收站中的表。
- DRS暂未支持回收站功能，如因开启回收站相关功能导致复制中断，请尝试重置链路，或[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)，联系客服处理。
  - DRS不会同步单条DROP TABLE语句的Session级回收站开关，是根据目标端Global级别回收站参数，判断DROP TABLE语句在目标端实例是否将表暂存入回收站。
  
  - DRS不会同步源端回收站的restore_table、restore_db、purge_table、系统自动清理操作。 如在源端实例执行restore_table、restore_db，目标端实例不会恢复对应表，后续源端对恢复后的表执行写操作会导致复制中断，建议存在复制链路的情况下，使用**insert into ... select ...**方式进行恢复。
    
   
- 如源端实例回收站中的表由小于2.0.63.250300版本的实例回收生成，则通过DRS迁移后，在目标端实例无法对迁移的表执行restore命令和show命令，后台清理线程也不会自动清理。如需清理，请手动调用purge_table命令进行清理。
- TaurusDB实例表回收站功能在2.0.57.240900版本仅支持表名由ASCII字符（如英文字母、数字、常见标点符号等）组成的表，其他表名字符类型（如拉丁字母、希腊字母、中文等）将在2.0.60.241200版本开放支持。
  ![](https://support.huaweicloud.com/kerneldesc-taurusdb/public_sys-resources/caution_3.0-zh-cn.png)
  若在2.0.57.240900版本对其他暂不支持字符类型表名的表进行回收和恢复，可能出现连接卡住的情况，此时请重启数据库或执行主备倒换，实例恢复后关闭回收站，对相关表进行删除。
  
- 2.0.63.xxxxxx版本实例支持库表回收站，部分第三方Binlog采集工具可能出现兼容性问题，建议用户根据实际业务场景选择是否升级。升级的详细操作请参考[升级TaurusDB实例内核小版本](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_05_2265.html)。
 
#### 计费说明
库表回收站功能所占用的存储空间将计入实例的总存储空间，并需按统一标准支付存储费用。详情请参见[TaurusDB价格详情](https://www.huaweicloud.com/pricing.html?tab=detail#/taurusdb)中的"存储空间价格"。
 #### 开启库表回收站
您可以通过设置参数"rds_recycle_bin_mode"来控制库表回收站功能的开启与关闭。开启库表回收站功能后，会根据[回收机制]进行数据的回收。
开启库表回收站有如下两种方法：
- 您可以单击TaurusDB实例，进入实例概览页面。在左侧导航栏中选择"参数修改"，通过修改"rds_recycle_bin_mode"参数来开启库表回收站功能。
- 通过命令在会话中设置库表回收站功能。 **set rds_recycle_bin_mode=\<*mode*\>;**
  
表3库表回收站参数说明 
| 参数名称                        | 级别             | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|:---|
| rds_recycle_bin_mode        | Global、Session | 回收站功能开关。 取值范围如下： - OFF（默认值）：关闭回收站功能。  - ON：启用回收站功能。启用功能后使用对应语句删除表，支持回收站功能的表将被移入回收站，不支持回收站功能的表将被直接删除。内核版本大于等于2.0.63.250300时支持。  - PRIORITY_RECYCLE_BIN：当同一个DROP语句中既包含支持回收站功能的表，又包含不支持回收站的表，则删除失败报错。内核版本大于等于2.0.63.250300时已弃用。  - PRIORITY_DROP_TABLE：当同一个DROP语句中既包含支持回收站的表，又包含不支持回收站的表，则对全部相关表执行彻底删除，无法恢复。内核版本大于等于2.0.63.250300时已弃用。   |
| rds_recycle_scheduler       | Global         | 后台自动清理过期表的功能开关。 取值范围如下： - OFF（默认值）：表示关闭后台自动清理过期数据功能。后台自动清理过期数据的功能关闭后，回收站中的表将被长期保存。  - ON：表示打开后台自动清理过期数据功能。后台自动清理过期数据的功能开启后，TaurusDB后台会自动删除回收站中达到最大保存时间的表。                                                                                                                                                                                                                                                                                                                                                                              |
| rds_recycle_bin_retention   | Global         | 回收站中表的最长保存时间（单位为秒）。 默认最长保存时间为259200秒（3天），支持的修改范围为0\~2592000秒。 修改"rds_recycle_bin_retention"参数后，回收站将以表进入回收站的时间为起始时间，重新计算回收站中全部表的预计自动清理时间。 如果将参数"rds_recycle_scheduler"设置为"ON"，表在回收站中保存的时间超过设置的最长保存时间后将被自动删除，无法恢复。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| rds_recycle_bin_binlog_mode | Global、Session | 回收站相关DDL语句在Binlog中的记录模式。内核版本大于等于2.0.63.250300时已弃用TRANSLATE，仅支持记录原始语句。 取值范围如下： - ORIGIN（默认值）：回收站相关语句会被直接记录到Binlog中。  - TRANSLATE：兼容社区语法，回收站相关语句会被转换为社区版MySQL支持的语句，并记录到Binlog中，在Binlog中会将回收站操作的**DROP TABLE** 及**restore_table** 转换记录为**RENAME TABLE**。                                                                                                                                                                                                                                                                                   |
   
#### 管理库表回收站
表4使用库表回收站 
| 功能                     | 使用介绍                                                                                                                                            | 示例                                                          |
|:---|:---|:---|
| **查看回收站中的表**           | 使用回收站提供的**show**命令，可以查看回收站中表的当前库名、当前表名、原库名、原表名、移入回收站时间、自动清理时间。                                                                                  | [使用示例]   |
| **恢复回收站中的表** **到原库原表** | 使用回收站提供的**restore**命令，指定通过查询命令返回的表名，恢复回收站中的表到原库原表，或指定库的指定表。恢复成功后，回收站中的对应表将被删除，无法再次恢复。                                                           | [使用示例] |
| **恢复回收站中所有指定原库的表**     | 使用回收站提供的**restore db**命令，指定通过查询命令返回的原库名，恢复回收站中的表到原库或指定库。恢复成功后，回收站中的对应表将被删除，无法再次恢复。                                                              | [使用示例]  |
| **系统自动清理**             | 您可以通过如下方法开启后台自动清理功能： 单击TaurusDB实例，进入实例概览页面。在左侧导航栏中选择"参数修改"，将参数"rds_recycle_scheduler"的值修改为"ON"。 | -                                                           |
| **手动清理指定表**            | 使用回收站提供的**purge**命令，指定通过查询命令返回的表名，可手动清理回收站中的表。执行清理命令后，表将被彻底删除，无法恢复。                                                                             | [使用示例] |
   
#### 使用示例
表回收站功能提供以下命令用于操作回收站中暂存的表。
#### 查看回收站中暂存的表
```
call dbms_recyclebin.show_tables();
```
```
| SCHEMA         | TABLE               | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME       | PURGE_TIME          |
| __recyclebin__ | test_db@t1@67ad67cb | test_db       | t1           | 2025-02-13 11:32:27 | 2025-02-16 11:32:27 |
| __recyclebin__ | test_db@t2@67ad67cb | test_db       | t2           | 2025-02-13 11:32:27 | 2025-02-16 11:32:27 |
```
#### 使用**INSERT INTO** **SELECT**语句恢复表
手动创建与原表表结构相同的新表后，通过**INSERT INTO ... SELECT ...**语句将表中数据恢复到新表。
![](https://support.huaweicloud.com/kerneldesc-taurusdb/public_sys-resources/caution_3.0-zh-cn.png)
通过INSERT INTO ... SELECT ...语句进行恢复不会移除回收站中暂存的数据，支持多次恢复，且生成的Binlog兼容性最佳。如实例存在基于Binlog的复制链路（如DRS数据复制服务、灾备实例），请避免使用call dbms_recyclebin.restore_table命令对回收站中的表进行恢复，建议使用INSERT INTO ... SELECT ...对数据进行恢复，降低复制中断的风险。
**示例：**
查询回收站中原库名为db，原表名为t1的表。
```
call dbms_recyclebin.show_tables();
+----------------+---------------------+---------------+--------------+---------------------+---------------------+
| SCHEMA         | TABLE               | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME       | PURGE_TIME          |
+----------------+---------------------+---------------+--------------+---------------------+---------------------+
| __recyclebin__ | test_db@t1@67ad67cb | test_db       | t1           | 2025-02-13 11:32:27 | 2025-02-16 11:32:27 |
| __recyclebin__ | test_db@t2@67ad67cb | test_db       | t2           | 2025-02-13 11:32:27 | 2025-02-16 11:32:27 |
+----------------+---------------------+---------------+--------------+---------------------+---------------------+
```
通过以上查询结果，确定需要恢复的表在回收站中的当前表名为test_db@t1@67ad67cb，执行**INSERT INTO ... SELECT ...** 命令，将回收站中表test_db@t1@67ad67cb的数据恢复到新创建的表t1中：
```
INSERT INTO `test_db`.`t1` SELECT * FROM `__recyclebin__`.`test_db@t1@67ad67cb`;
```
#### 恢复回收站中的表到原库原表
```
call dbms_recyclebin.restore_table('TABLE_NAME');
```
**参数说明：**
*TABLE_NAME*：回收站中表的当前表名。
**示例：**
将回收站中表**test_db@t1@67ad67cb**恢复到原库test_db，并保留原表名t1。
```
call dbms_recyclebin.restore_table('test_db@t1@67ad67cb');
```
#### 恢复回收站中的表到指定库的指定表
```
call dbms_recyclebin.restore_table('TABLE_NAME', 'DEST_DB', 'DEST_TABLE');
```
**参数说明：**
- *TABLE_NAME*：回收站中表的当前表名。
- *DEST_DB*：指定表恢复到的数据库。
- *DEST_TABLE*：指定表恢复后的表名。
**约束限制：**
- 执行恢复操作前请确保目标库存在，否则恢复命令将执行失败。
- 执行恢复操作前请确认目标库下不存在同名表，否则恢复将执行失败。
- 表回收站相关命令指定的引号内的库名、表名前后不允许有多余空格。
**示例**：
将回收站中表**test_db@t1@67ad67cb**恢复到指定库test_db2，并指定恢复后的表名为t3。
```
call dbms_recyclebin.restore_table('test_db@t1@67ad67cb','test_db2','t3');
```
#### 恢复回收站中所有指定原库的表
- 恢复回收站中所有指定原库的表到原库。
  ```
  call dbms_recyclebin.restore_db('DB_NAME');
  ```
  **参数说明：**
  *DB_NAME*：回收站中表的原库名。
  **示例：**
  将回收站中原库为test_db的表全部恢复到原库test_db，并保留原表名。
  ```
  call dbms_recyclebin.restore_db ('test_db');
  ```
  
- 恢复回收站中所有指定原库的表到新数据库。
  ```
  call dbms_recyclebin.restore_db ('DB_NAME', 'DEST_DB');
  ```
  **参数说明：**
  - *DB_NAME*：回收站中表的原库名。
  
  - *DEST_DB*：指定表恢复到的数据库。
  
  
  **示例：**
  将回收站中原库为test_db的表全部恢复到新库test_db2，并保留原表名。
  ```
  call dbms_recyclebin.restore_db('test_db', 'test_db2');
  ```
  
 
#### 清理回收站中指定表
```
call dbms_recyclebin.purge_table('TABLE_NAME');
```
**参数说明：**
*TABLE_NAME*：回收站中表的当前表名。
**示例：**
手动清理回收站中表**test_db@t1@67ad67cb**。
```
call dbms_recyclebin.purge_table('test_db@t1@67ad67cb');
```
