全部产品
Search
文档中心

云原生数据库 PolarDB:表回收站

更新时间:Aug 28, 2024

由于DDL操作无法回滚,如果开发或运维人员误操作了数据库(例如DROP TABLE),可能会导致数据丢失。PolarDB支持回收站(Recycle Bin)功能,用于将删除的表临时转移到回收站,并且您可以自定义删除表的保留时间,方便您找回数据。

前提条件

表回收站功能仅支持如下版本,您可以参见内核版本说明确认集群版本。

  • PolarDB MySQL版8.0.1版本且修订版本为8.0.1.1.2及以上。

  • PolarDB MySQL版8.0.2版本且修订版本为8.0.2.1.0及以上。

Recycle Bin原理介绍

  • 回收和清理机制

    • 回收机制

      当执行DROP TABLE语句来删除数据表,或执行DROP DATABASE语句来删除数据库时,PolarDB只会保留相关的表对象,并将表对象移动到专门的Recycle Bin目录中。其它对象的删除策略如下:

      • 与表无关的对象,根据操作语句决定是否保留,不做回收。

      • 对于可能会修改表数据的表附属对象(如TriggerForeign key),进行删除操作。但Column statistics不会被删除,而是随表进入回收站。

    • 清理机制

      回收站会启动一个后台线程,来异步清理超过recycle_bin_retention时间的表对象。在清理回收站中表的时候,如果遇到大表,系统会再启动一个后台线程异步删除大表。

  • 权限

    PolarDB集群启动时,系统会初始化一个数据库__recycle_bin__,作为回收站使用的专有数据库。__recycle_bin__是系统级数据库,您无法直接进行修改和删除。

    对于回收站内的表,虽然您无法直接执行DROP TABLE语句,但是可以使用call dbms_recycle.purge_table('table name');对表进行清理。

    说明

    执行清理操作的数据库账号在原表和回收站表都需要具有DROP权限。

  • 回收站表命名规则

    Recycle Bin会从不同的数据库中回收表对象到__recycle_bin__数据库中。因此需要定义如下的表名格式,用来保证目标表名的唯一性:

    "__" + <Storage Engine> + <SE private id> 

    参数说明如下:

    参数

    说明

    Storage Engine

    存储引擎名称。

    SE private id

    存储引擎为每一个表生成的唯一值。例如在InnoDB引擎中就是table id

  • 独立回收

    例如您可以在主节点上设置回收站内数据的最长保留周期为7天;在只读节点上设置回收站内数据的最长保留周期为14天。

    说明

    设置不同的回收站内数据的最长保留周期,将导致集群的存储空间占用差别较大。

注意事项

  • 如果回收站数据库__recycle_bin__和待回收的表在不同的文件系统中,执行DROP TABLE语句将会搬迁表空间文件,耗时较长。

  • 如果表空间为General,可能会存在多个表共享同一个表空间的情况。当回收表空间中其中一张表的时候,不会搬迁相关的表空间文件。

使用方法

您可以先通过loose_recycle_bin参数打开表回收站功能,并可以通过loose_recycle_bin_retention参数设置回收站内数据的最长保留周期、loose_recycle_scheduler设置回收站的异步清理任务线程。具体操作请参见设置集群参数和节点参数。参数说明如下:

参数

级别

说明

loose_recycle_bin

Global、Session

表回收站功能开关。取值范围如下:

  • ON:打开表回收站功能开关。

  • OFF(默认值):关闭表回收站功能开关。

loose_recycle_bin_retention

Global

回收站内数据的最长保留周期。取值范围:86400~1209600,单位为秒。默认值为604800(即7天)。

loose_recycle_scheduler

Global

回收站的异步清理任务线程开关。取值范围如下:

  • ON:打开回收站的异步清理任务线程开关。

  • OFF(默认值):关闭回收站的异步清理任务线程开关。

管理Recycle Bin

Recycle Bin提供了如下SQL语句来管理Recycle Bin:

  • show_tables

    查看回收站中所有临时保存的表。

    call dbms_recycle.show_tables()

    示例:

    call dbms_recycle.show_tables();
    +-----------------+---------------+---------------+--------------+---------------------+---------------------+
    | SCHEMA          | TABLE         | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME       | PURGE_TIME          |
    +-----------------+---------------+---------------+--------------+---------------------+---------------------+
    | __recycle_bin__ | __innodb_1063 | product_db    | t1           | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 |
    | __recycle_bin__ | __innodb_1064 | product_db    | t2           | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 |
    | __recycle_bin__ | __innodb_1065 | product_db    | parent       | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 |
    | __recycle_bin__ | __innodb_1066 | product_db    | child        | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 |
    +-----------------+---------------+---------------+--------------+---------------------+---------------------+
    4 rows in set (0.00 sec)

    参数说明如下:

    参数

    说明

    SCHEMA

    回收站的Schema。

    TABLE

    进入回收站后的表名。

    ORIGIN_SCHEMA

    原始表的Schema。

    ORIGIN_TABLE

    原始表的表名。

    RECYCLED_TIME

    回收时间。

    PURGE_TIME

    预计在回收站中被清理的时间。

  • purge_table

    手动清理回收站中的表。

    call dbms_recycle.purge_table('TABLE_NAME')
    说明
    • TABLE_NAME为进入回收站后的表名。

    • 执行清理操作的数据库账号在原表和回收站表都需要具有DROP权限。

    示例:

    mysql> call dbms_recycle.purge_table('__innodb_1063');
  • restore_table

    快速恢复回收站内的表。

    call dbms_recycle.restore_table('RECYCLE_TABLE','DEST_DB','DEST_TABLE');
    说明
    • PolarDB MySQL版8.0版本集群版的Revision version为8.0.1.1.12或以上才支持通过restore_table命令,快速恢复回收站内的表。您可以参见查询版本号确认集群版本。

    • 执行此命令需要有数据库__recycle_bin__的ALTER_ACL和DROP_ACL权限,以及目标表的CREATE_ACL和INSERT_ACL权限。

    参数说明如下:

    参数

    说明

    RECYCLE_TABLE

    需要恢复的表在回收站内的表名。

    说明

    如果仅传入此参数,会恢复到原始表。

    DEST_DB

    为恢复后的表指定目标数据库。

    DEST_TABLE

    为恢复后的表指定新的表名。

    示例:

    call dbms_recycle.restore_table('__innodb_1063','testDB','testTable');

联系我们

若您对DDL操作有任何疑问,请联系我们