TaurusDB表回收站
TaurusDB支持表回收站功能,启用此功能开关后,符合条件的DROP TABLE命令不会直接删除指定表,而是将表暂时存放到回收站中,达到最大保存时间后,后台会自动删除。
回收站功能支持修改被删除表在回收站中的保留时间,您也可以随时将表从回收站中恢复或彻底删除。
约束与限制
- TaurusDB实例的内核版本为2.0.57.240900及以上时支持使用表回收站功能。
- 如果TaurusDB实例内核版本低于2.0.57.240900,且用户手动创建了名为“__recyclebin__”的数据库,则实例升级到2.0.57.240900及以上版本时,可能出现升级预检查失败。请手动删除“__recyclebin__”数据库后重新升级。如需继续保留用户创建的“__recyclebin__”数据库作为普通数据库进行使用,请在管理控制台右上角,选择“工单 > 新建工单”,联系技术支持处理。
- 表回收站功能仅支持普通innodb表,不支持共享表空间、全文索引、临时表、非innodb表、存在Secondary Engine的表、系统表、隐藏表。
- 当前版本表回收站仅支持单条DROP TABLE语句中,全部表都支持表回收站功能的情况。如多表删除语句中部分表支持表回收站,部分表不支持表回收站,则根据实例参数“rds_recycle_bin_mode”判断语句执行失败报错,或彻底删除全部指定表。
- 当前版本表回收站仅支持通过DROP TABLE命令删除表,其他删除命令会将表直接删除,无法恢复。
- 如实例存在基于Binlog的复制链路(如DRS数据复制服务、灾备实例),且回收站Binlog记录模式为ORIGIN时,在源端清理或恢复回收站中的表,可能会导致复制异常或数据不一致。建议用户设置回收站Binlog记录模式为TRANSLATE。
- 当前版本DRS数据复制服务暂未完整支持回收站功能,如因开启回收站相关功能导致复制中断,请尝试重置链路,或在管理控制台右上角,选择“工单 > 新建工单”,联系技术支持处理。
- TaurusDB实例表回收站功能在2.0.57.240900版本仅支持表名由ASCII字符(如英文字母、数字、常见标点符号等)组成的表,其他表名字符类型(如拉丁字母、希腊字母、中文等)将在2.0.60.241200版本开放支持。
若在2.0.57.240900版本对其他暂不支持字符类型表名的表进行回收和恢复,可能出现连接卡住的情况,此时请重启数据库或执行主备倒换,实例恢复后关闭回收站,对相关表进行删除。
功能介绍
创建或者升级到大于等于2.0.57.240900的实例时,TaurusDB会初始化名为“__recyclebin__”的数据库。开启表回收站功能后,执行DROP TABLE语句不会直接删除表,而是暂时将指定表移入“__recyclebin__”库中,并将表重命名。
- 如果被删除的表为回收站不支持的类型,则DROP TABLE语句将直接删除指定表,而不会将表移入回收站。
- 如果实例打开回收站功能,短时间内删除有同名约束的表,可能会因为“__recyclebin__”数据库下存在同名约束导致移入回收站失败。如果移入回收站失败,请检查被删除的表是否存在约束,删除约束后重新执行DROP TABLE语句进行删除。
回收站中表名规则如下:
__<storage engine name>_<schema name>_<table name>_<id>
回收站中表的<id>保证唯一,相同表名的表被移入回收站后表名不会出现重复。如<schema name>或<table name>长度超过10个字符,将截取前10个字符拼接到回收站表的表名中,并在<id>后增加“_”字符表示原库名或原表名被截断。
- 开启表回收站
开启表回收站有如下两种方法:
- 您可以单击TaurusDB实例名称,进入实例概览页面。在左侧导航栏中选择“参数修改”,通过修改“rds_recycle_bin_mode”参数来开启表回收站功能。
- 通过命令在会话中设置表回收站功能。
set rds_recycle_bin_mode=PRIORITY_RECYCLE_BIN;
表1中提供了表回收站相关的一些功能参数,您可以根据需要进行设置。表1 表回收站参数说明 参数名称
级别
说明
rds_recycle_bin_mode
Global、Session
回收站功能开关。
取值范围如下:
- OFF(默认值):关闭回收站功能。
- PRIORITY_RECYCLE_BIN:当同一个DROP语句中既包含支持回收站功能的表,又包含不支持回收站的表,则删除失败报错。
- PRIORITY_DROP_TABLE:当同一个DROP语句中既包含支持回收站的表,又包含不支持回收站的表,则对全部相关表执行彻底删除,无法恢复。
rds_recycle_scheduler
Global
后台自动清理过期表的功能开关。
取值范围如下:
- OFF(默认值):表示关闭后台自动清理过期数据功能。后台自动清理过期数据的功能关闭后,回收站中的表将被长期保存。
- ON:表示打开后台自动清理过期数据功能。后台自动清理过期数据的功能开启后,TaurusDB后台会自动删除回收站中达到最大保存时间的表。
rds_recycle_bin_retention
Global
回收站中表的最长保存时间(单位为秒)。
默认最长保存时间为259200秒(3天),支持的修改范围为0~2592000秒。
如果将参数“rds_recycle_scheduler”设置为“ON”,表在回收站中保存的时间超过设置的最长保存时间后将被自动删除,无法恢复。
rds_recycle_bin_binlog_mode
Global、Session
回收站相关DDL语句在Binlog中的记录模式。
取值范围如下:
- ORIGIN(默认值):回收站相关语句会被直接记录到Binlog中。
- TRANSLATE:兼容社区语法,回收站相关语句会被转换为社区版MySQL支持的语句,并记录到Binlog中。
- 修改“rds_recycle_bin_retention”参数后,回收站将以表进入回收站的时间为起始时间,重新计算回收站中全部表的预计自动清理时间。
- 修改“rds_recycle_bin_binlog_mode”为“TRANSLATE”模式时,在Binlog中会将回收站操作的DROP TABLE及restore_table转换记录为RENAME TABLE。即使目标端为TaurusDB实例,对于通过Binlog复制到目标端数据库__recyclebin__中的表,也无法使用show_tables、restore_table、purge_table命令对其操作,目标端实例回收站后台自动清理功能也不会对其进行清理。目标端实例回收站中的表仅支持通过回放源端的restore_table、purge_table及后台自动清理进行恢复和清理。
- 查看回收站中的表
使用回收站提供的show命令,可以查看回收站中表的当前库名、当前表名、原库名、原表名、移入回收站时间、自动清理时间。
具体操作请参见使用示例。
- 恢复回收站中的表
使用回收站提供的restore命令,指定通过查询命令返回的表名,恢复回收站中的表到原库原表,或指定库的指定表。恢复成功后,回收站中的对应表将被删除,无法再次恢复。
具体操作请参见使用示例。
- 后台自动清理
开启后台自动清理功能后,在实例主机将创建后台清理线程,自动清理达到最大保存时间(默认保存3天)的表。后台清理的表将被彻底删除,无法恢复。
您可以通过如下方法开启后台自动清理功能:
单击TaurusDB实例,进入实例概览页面。在左侧导航栏中选择“参数修改”,将参数“rds_recycle_scheduler”的值修改为“ON”。
表2 参数说明 参数名称
级别
说明
rds_recycle_scheduler
Global
后台自动清理过期表的功能开关。
取值范围如下:
- OFF(默认值):关闭后台自动清理过期数据。
- ON:打开后台自动清理过期数据。
后台自动清理任务在RegionLessDB集群的从实例中不会执行自动清理。
- 手动清理指定表
使用回收站提供的purge命令,指定通过查询命令返回的表名,可手动清理回收站中的表。执行清理命令后,表将被彻底删除,无法恢复。
具体操作请参见使用示例。
- 回收站权限控制
“__recyclebin__”作为回收站临时存放被删除表的数据库,不允许对回收站中的表进行修改或删除。如需查看、恢复或者清理回收站中的表,可以通过回收站功能提供的命令对“__recyclebin__”下的表进行操作,并且操作账号需要同时对回收站中的表或恢复的目标表具有相应的操作权限,才可以进行操作,具体权限要求如下:
- 查看回收站中表的信息:对“__recyclebin__”中表的SELECT权限。
- 清理回收站中指定表:对“__recyclebin__”中表的DROP权限。
- 恢复回收站中指定表:对“__recyclebin__”中表的ALTER、DROP权限,以及对恢复的目标表的CREATE、INSERT权限。
- 回收站中的表将占用实例的存储空间,直到被清理。如需提前释放,请手动清理回收站中的表。
- 表被移入回收站后,表的触发器和外键将被彻底删除,无法恢复。
使用示例
表回收站功能提供以下命令用于操作回收站中暂存的表。
- 查看回收站中暂存的表
call dbms_recyclebin.show_tables();
返回结果格式如下:
+----------------+--------------------------+---------------+--------------+---------------------+---------------------+ | SCHEMA | TABLE | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME | PURGE_TIME | +----------------+--------------------------+---------------+--------------+---------------------+---------------------+ | __recyclebin__ | __innodb_test_db_t1_1069 | test_db | t1 | 2024-09-29 08:48:27 | 2024-10-02 08:48:27 | | __recyclebin__ | __innodb_test_db_t2_1070 | test_db | t2 | 2024-09-29 08:48:44 | 2024-10-02 08:48:44 | +----------------+--------------------------+---------------+--------------+---------------------+---------------------+
表3 字段说明 字段
说明
SCHEMA
回收站中表的当前库名。
TABLE
回收站中表的当前表名。
ORIGIN_SCHEMA
移入回收站前的原库名。
ORIGIN_TABLE
移入回收站前的原表名。
RECYCLED_TIME
表被移入回收站的时间。
PURGE_TIME
预计表被自动清理的时间。
- 恢复回收站中的表
- 手动创建与原表表结构相同的新表后,通过INSERT INTO ... SELECT ...语句将表中数据恢复到新表
查询回收站中原库名为db,原表名为t1的表:
call dbms_recyclebin.show_tables();
返回结果格式如下:
+----------------+--------------------------+---------------+--------------+---------------------+---------------------+ | SCHEMA | TABLE | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME | PURGE_TIME | +----------------+--------------------------+---------------+--------------+---------------------+---------------------+ | __recyclebin__ | __innodb_test_db_t1_1069 | db | t1 | 2024-09-29 08:48:27 | 2024-10-02 08:48:27 | | __recyclebin__ | __innodb_test_db_t2_1070 | db | t2 | 2024-09-29 08:48:44 | 2024-10-02 08:48:44 | +----------------+--------------------------+---------------+--------------+---------------------+---------------------+
通过以上查询结果,确定需要恢复的表在回收站中的当前表名为__innodb_test_db_t1_1069,执行INSERT INTO ... SELECT ...命令,将回收站中表__innodb_test_db_t1_1069的数据恢复到新创建的表t1中:
INSERT INTO `db`.`t1` SELECT * FROM `__recyclebin__`.`__innodb_test_db_t1_1069`;
通过INSERT INTO ... SELECT ...语句进行恢复不会移除回收站中暂存的数据,支持多次恢复,且生成的Binlog兼容性最佳。如实例存在基于Binlog的复制链路(如DRS数据复制服务、灾备实例),建议使用该方式对数据进行恢复,降低由于目标端不支持表回收站功能、用户权限不足等原因导致复制中断的风险。
- 恢复回收站中的表到原库原表
call dbms_recyclebin.restore_table('TABLE_NAME');
表4 参数说明 参数名称
说明
TABLE_NAME
回收站中表的当前表名。
示例:
将回收站中表__innodb_test_db_t1_1069恢复到原库test_db,并保留原表名t1。
call dbms_recyclebin.restore_table('__innodb_test_db_t1_1069');
- 恢复回收站中的表到指定库的指定表
call dbms_recyclebin.restore_table('TABLE_NAME', 'DEST_DB', 'DEST_TABLE');
表5 参数说明 参数名称
说明
TABLE_NAME
回收站中表的当前表名。
DEST_DB
指定表恢复到的数据库。
DEST_TABLE
指定表恢复后的表名。
示例:
将回收站中表__innodb_test_db_t1_1069恢复到指定库test_db2,并指定恢复后的表名为t3。
call dbms_recyclebin.restore_table('__innodb_test_db_t1_1069','test_db2','t3');
- 执行恢复操作前请确保目标库存在,否则恢复命令将执行失败。
- 执行恢复操作前请确认目标库下不存在同名表,否则恢复将执行失败。
- 表回收站相关命令指定的引号内的库名、表名前后不允许有多余空格。
- 手动创建与原表表结构相同的新表后,通过INSERT INTO ... SELECT ...语句将表中数据恢复到新表