表回收站
由于DDL语句无法回滚,开发或运维人员如果误删除表可能会导致数据丢失。云原生数据仓库 AnalyticDB MySQL 版支持表回收站(Recycle Bin)功能,能够将删除的表临时转移到表回收站,还可以设置保留的时间,方便您找回误删数据。
前提条件
AnalyticDB for MySQL集群需为3.2.3.0及以上版本。
- 查看企业版、基础版或湖仓版集群的内核版本,请执行 - SELECT adb_version();。如需升级内核版本,请联系技术支持。
- 查看和升级数仓版集群的内核版本,请参见查看和升级版本。 
注意事项
- 表回收站功能仅支持AnalyticDB for MySQL内表(即表引擎为XUANWU或XUANWU_V2的表)。外表(External Table)不支持此功能。 
- 执行 - INSERT OVERWRITE SELECT任务时,若进行- DROP TABLE操作,删除的表会进入回收站,- INSERT OVERWRITE SELECT任务会执行失败。
- 执行 - BUILD任务时,若进行- DROP TABLE操作,删除的表会进入回收站,- BUILD任务会继续正常执行直到结束。
- 进入回收站的表,依然会占用存储空间。 
表回收站介绍
表回收站用于临时存放已删除的表。首次执行DROP操作时,AnalyticDB for MySQL会创建一个名为ADB_RECYCLE_BIN的隐藏库,并将已删除的表迁移到ADB_RECYCLE_BIN数据库。
回收机制
通过DROP TABLE命令删除的表,会自动迁移到表回收站。
通过DROP TABLE ... FORCE命令强制删除的表将直接被删除,不会进入表回收站。
保留时长与清理机制
表进入回收站后,默认保留3天。超过3天将自动清理。您可以通过配置参数设置保留时长和清理机制。配置方法请参见回收站配置。您也可以手动执行PURGE操作清理回收站。具体用法请参见删除回收站中的表。
回收站支持的操作
回收站表命名规则
表回收站会从不同的数据库回收表到统一的ADB_RECYCLE_BIN数据库中。为了保证表名的唯一性,定义如下命名格式:原数据库名_原表名_进入回收站的时间戳。
例如:某用户在2024年1月1日00:00:00删除了adb_demo库中的customer表,则这张表在表回收站中重新命名为:adb_demo_customer_1704038400000。
- 如果新表名的长度超过了表名的长度上限,会自动按照原表名、原库名的顺序进行命名裁剪。因此,新表名中的原数据库名和原表名可能会有部分缺失。 
- 当回收站中已经有被删除的相同表,新删除的表仍会进入回收站,需要根据时间戳来进行区分。 
回收站配置
您可以通过SET ADB_CONFIG命令修改相关配置。
| 参数 | 说明 | 
| DROP_FORCE | 执行 | 
| RECYCLE_BIN_EXPIRED_TIME | 进入表回收站后的保留时间。修改该配置对已经在表回收站中的表不生效。单位:毫秒(ms)。默认值:259200000,即3天。 重要  为了避免磁盘空间被占满,建议合理设置保留时间。 | 
| ENABLE_RECYCLE_BIN_CLEAN_EXPIRED_TABLE | 是否打开表回收站的异步清理任务线程。默认值:TRUE。 重要  建议保持异步清理任务线程的默认开启状态。 | 
| RECYCLE_BIN_CLEAN_EXPIRED_TABLE_INTERVAL | 表回收站异步清理任务线程的轮询间隔。单位:毫秒(ms)。默认值:60000。 | 
管理表回收站
显示表回收站中的表
语法
- 显示表回收站中所有表信息。 - SHOW RECYCLE_BIN ALL;
- 显示表回收站中指定表信息,可能包含同名库的同名表。 - SHOW RECYCLE_BIN TABLE <原数据库名>.<原表名>;
- 显示表回收站中指定表信息,可能包含多个库的同名表。 - SHOW RECYCLE_BIN TABLE <原表名>;
- 显示表回收站中指定库所包含的表。 - SHOW RECYCLE_BIN DATABASE <原数据库名>;
示例
- 查看表回收站中所有表,示例语句如下: - SHOW RECYCLE_BIN ALL;- 返回结果: - +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+ | userName | schemaName | tableName | originSchemaName | originTableName | recycledTime | expiredTime | +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+ | testUser | ADB_RECYCLE_BIN | adb_demo_customer_1720086117277 | adb_demo | customer | 2024-07-04 17:42:00 | 2024-07-07 17:42:00 | | testUser | ADB_RECYCLE_BIN | adb_demo_orders_1720086094102 | adb_demo | orders | 2024-07-04 17:41:37 | 2024-07-07 17:41:37 | | testUser | ADB_RECYCLE_BIN | testdb_customer_1720085752664 | testdb | customer | 2024-07-04 17:35:56 | 2024-07-07 17:35:56 | +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+
- 查看表回收站中的指定表adb_demo.customer,示例语句如下: - SHOW RECYCLE_BIN TABLE adb_demo.customer;- 返回结果: - +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+ | userName | schemaName | tableName | originSchemaName | originTableName | recycledTime | expiredTime | +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+ | testUser | ADB_RECYCLE_BIN | adb_demo_customer_1720086117277 | adb_demo | customer | 2024-07-04 17:42:00 | 2024-07-07 17:42:00 | +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+
- 查看所有原始表名为customer的表,示例语句如下: - SHOW RECYCLE_BIN TABLE customer;- 返回结果: - +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+ | userName | schemaName | tableName | originSchemaName | originTableName | recycledTime | expiredTime | +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+ | testUser | ADB_RECYCLE_BIN | adb_demo_customer_1720086117277 | adb_demo | customer | 2024-07-04 17:42:00 | 2024-07-07 17:42:00 | | testUser | ADB_RECYCLE_BIN | testdb_customer_1720085752664 | testdb | customer | 2024-07-04 17:35:56 | 2024-07-07 17:35:56 | +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+
- 查看所有原数据库为adb_demo的表,示例语句如下: - SHOW RECYCLE_BIN DATABASE adb_demo;- 返回结果: - +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+ | userName | schemaName | tableName | originSchemaName | originTableName | recycledTime | expiredTime | +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+ | testUser | ADB_RECYCLE_BIN | adb_demo_customer_1720086117277 | adb_demo | customer | 2024-07-04 17:42:00 | 2024-07-07 17:42:00 | | testUser | ADB_RECYCLE_BIN | adb_demo_orders_1720086094102 | adb_demo | orders | 2024-07-04 17:41:37 | 2024-07-07 17:41:37 | +----------+-----------------+---------------------------------+------------------+-----------------+---------------------+---------------------+
恢复原始表
规则
- 恢复后的表仍然使用进入回收站前的原表名。 
- 若在恢复时,原数据库已经存在同名表,请按照提示先对原数据中的同名表进行更名、删除或移动到其他数据库等操作。 
- 若在批量恢复时,表回收站中有多张表的原库名和原表名相同,只是时间戳不同。则会按时间戳倒序先恢复第一张表,恢复第二张表时会出现报错,请按照提示先对原数据中已恢复的同名表进行更名、删除或移动到其他数据库等操作。 
语法
- 恢复表回收站中所有表到原数据库。 - RESTORE RECYCLE_BIN ALL;
- 恢复表回收站中指定表到原数据库。 - RESTORE RECYCLE_BIN TABLE <ADB_RECYCLE_BIN数据库中的表名>;
示例
恢复表回收站中的指定表adb_demo_customer_1720086117277,示例语句如下:
RESTORE RECYCLE_BIN TABLE adb_demo_customer_1720086117277;删除回收站中的表
语法
- 删除表回收站中所有表。 - PURGE RECYCLE_BIN ALL;
- 删除表回收站中指定表。 - PURGE RECYCLE_BIN TABLE <ADB_RECYCLE_BIN数据库中的表名>;
示例
永久删除表回收站中指定表adb_demo_customer_1720086117277,示例语句如下:
PURGE RECYCLE_BIN TABLE adb_demo_customer_1720086117277;修改自动保留时间
语法
修改表回收站的自动保留时间。
SET adb_config RECYCLE_BIN_EXPIRED_TIME=<自定义的自动保留时间>;修改后的自动保留时间仅作用于修改配置后删除的表,在修改之前已在回收站的表仍将遵循以前的配置。
示例
修改表回收站的自动保留时间为2天,示例语句如下:
#注意单位为毫秒,则示例自动保留时间为:2 * 24 * 3600 * 1000 = 172800000(ms)
SET adb_config RECYCLE_BIN_EXPIRED_TIME=172800000;