由于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;