MySQL单机版Recycle Bin回收站功能

最近调研了阿里的Recycle Bin回收站功能,可以保证数据不丢失。

为了防止开发或运维人员的误操作,比如DROP TABLE/DATABASE、TRUNCATE TABLE,这类DDL语句不具有可操作的回滚特性,而导致数据丢失,AliSQL 8.0(基于MySQL)新特性支持回收站功能(Recycle Bin),临时把删除的表转移到回收站,并保留可设置的时间,方便用户找回数据。为了方便,提供了 DBMS_RECYCLE package 作为管理接口。

前提条件 MySQL单机版

实例版本如下:

  • RDS MySQL 8.0
  • RDS MySQL 5.7

Recycle Bin参数

Recycle Bin设计了如下五个参数。

参数说明
loose_recycle_bin是否打开回收站功能,包括session级别和global级别。您可以在控制台修改参数。默认值:OFF。
loose_recycle_bin_retention回收站保留时间,单位:秒。默认为604800,即一周。您可以在控制台修改参数。
loose_recycle_scheduler是否打开回收站的异步清理任务线程。您可以在控制台修改参数。默认值:OFF。
loose_recycle_scheduler_interval回收站异步清理任务线程的轮询间隔,单位:秒。默认为30。暂不开放。
loose_recycle_scheduler_purge_table_print是否打印异步清理现场工作的详细日志。暂不开放。

Recycle Bin介绍

  • 回收/清理机制
    • 回收机制执行TRUNCATE TABLE语句时,将原始表移动到专门的recycle bin目录中,并在原位置使用相同的结构创建新表。

      说明 仅RDS MySQL 8.0支持。

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

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

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

  • 权限

    RDS MySQL实例启动时,会初始化一个名为__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。

独立回收

回收的设置只会影响该实例本身,不会影响到binlog复制到的节点(备实例、只读实例和灾备实例)上。例如我们可以在主实例上设置回收,保留7天;在备实例上设置回收,保留14天。

注意事项

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

管理Recycle Bin

AliSQL在DBMS_RECYCLE中定义了两个管理接口。详细说明如下:

  • show_tables展示回收站中所有临时保存的表。命令如下:
    call dbms_recycle.show_tables();

 参数如下:

参数说明
SCHEMA回收站的数据库名。
TABLE进入回收站后的表名。
ORIGIN_SCHEMA原数据库名。
ORIGIN_TABLE原表名。
RECYCLED_TIME回收时间。
PURGE_TIME预计从回收站删除的时间。

purge_table

手动清理回收站中的表。命令如下:

call dbms_recycle.purge_table('<TABLE>');
  • TABLE为进入回收站后的表名。
  • 账号在原表和回收站表都需要具有DROP权限。

示例:

call dbms_recycle.purge_table('__innodb_1063');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值