由于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目录中。其它对象的删除策略如下:与表无关的对象,根据操作语句决定是否保留,不做回收。
对于可能会修改表数据的表附属对象(如
Trigger
和Foreign 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_scheduler用于控制表回收站的清理机制。若未启用清理机制,则将忽略参数loose_recycle_bin_retention的设置,数据将被长期保留。
参数 | 级别 | 说明 |
loose_recycle_bin | Global、Session | 表回收站功能开关。取值范围如下:
|
loose_recycle_scheduler | Global | 回收站的异步清理任务线程开关。取值范围如下:
|
loose_recycle_bin_retention | Global | 回收站内数据的最长保留周期。取值范围:86400~1209600,单位为秒。默认值为604800(即7天)。 重要
|
管理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操作有任何疑问,可通过钉钉搜索群号入群咨询。您可以直接@群内专家,并附上您要咨询的问题;同时群内也有PolarDB MySQL版小助手24*7小时在线回答您的问题。钉钉群号:15375044501。