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

前提条件

PolarDB集群版本需为PolarDB MySQL 8.0且Revision version为8.0.1.1.2或以上,您可以参见查询版本号确认集群版本

注意事项

  • 如果回收站数据库和待回收的表跨了文件系统,执行drop table语句将会搬迁表空间文件,耗时较长。
  • 如果表空间为General,可能会存在多个表共享同一个表空间的情况,当回收其中一张表的时候,不会搬迁相关的表空间文件。

Recycle Bin介绍

  • 回收和清理机制
    • 回收机制

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

      • 如果是与表无关的对象,根据操作语句决定是否保留,不做回收。
      • 如果是表的附属对象,可能会修改表数据的,做删除处理,例如Trigger和Foreign key。 但Column statistics不做清理,随表进入回收站。
    • 清理机制

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

  • 权限

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

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

    说明 执行清理操作的账号在原表和回收站表都需要具有DROP权限。
  • 回收站表命名规则
    Recycle Bin会从不同的数据库回收到统一的__recycle_bin__数据库中,所以需要保证目标表表名唯一,所以定义了如下命名格式:
    "__" + <Storage Engine> + <SE private id>

    参数说明如下。

    参数 说明
    Storage Engine 存储引擎名称。
    SE private id 存储引擎为每一个表生成的唯一值。例如在InnoDB引擎中就是table id。
  • 独立回收

    例如我们可以在主节点上设置回收,保留7天;在只读节点上设置回收,保留14天。

    说明 回收站保留周期不同,将导致实例的空间占用差别比较大。

参数

使用Recycle Bin功能前,您需要先配置如下参数。

参数 说明
recycle_bin 是否打开回收功能,包括session级别和global级别。
recycle_bin_retention 回收站内数据的最长保留周期。取值范围为1~31536000,单位为秒。默认取值为604800(即7天)。
recycle_scheduler 是否打开回收站的异步清理任务线程。
recycle_scheduler_interval 回收站异步清理线程的轮询间隔,单位为秒,默认取值为30。
recycle_scheduler_purge_table_print 是否打印异步清理现场工作的详细日志。

管理语句

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

  • 展示回收站中所有临时保存的表:
    DBMS_RECYCLE.show_tables()

    示例

    mysql> 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 预计从回收站删除的时间。
  • 手动清理回收站中的某张表:
    DBMS_RECYCLE.purge_table('table_name')
    说明
    • table_name为进入回收站后的表名。
    • 执行清理操作的账号在原表和回收站表都需要具有DROP权限。

    示例

    mysql> call dbms_recycle.purge_table('__innodb_1063');
    Query OK, 0 rows affected (0.01 sec)