表回收站

由于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操作清理回收站。具体用法请参见删除回收站中的表

回收站支持的操作

  • 具有原表DROP权限的用户,才能操作回收站中的表。

  • 回收站中的表,仅支持删除PURGE恢复(RESTORE)以及显示(SHOW)操作。

回收站表命名规则

表回收站会从不同的数据库回收表到统一的ADB_RECYCLE_BIN数据库中。为了保证表名的唯一性,定义如下命名格式:原数据库名_原表名_进入回收站的时间戳

例如:某用户在2024年1月1日00:00:00删除了adb_demo库中的customer表,则这张表在表回收站中重新命名为:adb_demo_customer_1704038400000。

说明
  • 如果新表名的长度超过了表名的长度上限,会自动按照原表名、原库名的顺序进行命名裁剪。因此,新表名中的原数据库名和原表名可能会有部分缺失。

  • 当回收站中已经有被删除的相同表,新删除的表仍会进入回收站,需要根据时间戳来进行区分。

回收站配置

您可以通过SET ADB_CONFIG命令修改相关配置。

参数

说明

DROP_FORCE

执行DROP操作时是否默认永久删除。若为FALSE,则进入表回收站,若为TRUE,则永久删除。默认值:FALSE。

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;