从表回收站中恢复误删的表

由于DDL语句无法回滚,如果误删除了表(例如DROP TABLE),可能会导致数据丢失。PolarDB提供了表回收站的功能,删除的表会被临时转移到表回收站,因此您可以从表回收站恢复误删的表。

背景信息

关于更多表回收站的信息,请参见表回收站

前提条件

  • 仅当集群版本为PolarDB MySQL版8.0版本,且内核小版本为8.0.1.1.2及以上时,才支持表回收站功能。

  • 请确保误删除前已开启表回收站功能:设置集群参数loose_recycle_binON,设置参数值的具体操作请参见设置集群参数和节点参数

  • 请确保误删表的时间点在表回收站内数据的最长保留周期内。可设置集群参数loose_recycle_bin_retention(单位:秒),来定义该最长保留周期,设置参数值的具体操作请参见设置集群参数和节点参数

操作步骤

  1. 执行如下语句,查看回收站中所有临时保存的表。

    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

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

  2. 执行如下语句,快速恢复回收站内的某张表。

    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_TABLE

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

    说明

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

    DEST_DB

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

    DEST_TABLE

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

    示例:

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