开发者社区> Roin123> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

再也不怕数据丢失!阿里云RDS MySQL 8.0上线回收站功能

简介: MySQL 在生产环境使用过程中,会伴随着开发和运维人员的误操作,比如 DROP TABLE / DATABASE,这类 DDL 语句不具有可操作的回滚特性,而导致数据丢失,AliSQL 8.0 新特性支持回收站功能(Recycle Bin),临时把删除清理的表转移到回收站,并保留可设置的时间。
+关注继续查看

RDS MySQL 8.0 Recycle Bin

背景

MySQL 在生产环境使用过程中,会伴随着开发和运维人员的误操作,比如 DROP TABLE / DATABASE,这类 DDL 语句不具有可操作的回滚特性,而导致数据丢失,AliSQL 8.0 新特性支持回收站功能(Recycle Bin),临时把删除清理的表转移到回收站,并保留可设置的时间,方便用户找回数据。为了方便,提供了 DBMS_RECYCLE package 作为管理接口。

Recycle Bin 管理接口

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)

-- Columns 解释:

SCHEMA
回收站的 schema
TABLE
进入回收站后的表名
ORIGIN_SCHEMA
原始表的 schema
ORIGIN_TABLE
原始表的表名
RECYCLED_TIME
回收时间
PURGE_TIME
未来被清理掉的时间

1,
DBMS_RECYCLE.purge_table(table_name=>)
手动清理回收站中的某张表

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


清理掉回收站中的"__innodb_1063" 表

Recycle Bin 参数
Recycle Bin 一共设计了 5 个参数,分别是:

1,recycle_bin

recycle_bin

-- 是否打开回收功能, session + global 级别。

2,recycle_bin_retention

recycle_bin_retention


    -- 回收站保留最长时间是多少,单位是seconds,默认是一周。

3,recycle_scheduler

recycle_scheduler
    -- 是否打开回收站的异步清理任务线程

4,recycle_scheduler_interval

recycle_scheduler_interval
    -- 回收站异步清理线程的轮询间隔,单位是seconds, 默认是30s。

5,recycle_scheduler_purge_table_print

recycle_scheduler_purge_table_print
    -- 是否打印异步清理现场工作的详细日志

Recycle Bin 设计
Recycle Bin 总览

1. 回收机制

当操作 DROP TABLE / DATABASE 语句的时候, 只保留相关的表对象,并移动到专门的 recycle bin 目录中,
其它对象的删除策略是:

  1. 与表无关的对象,比如 procedure,根据操作语句决定是否保留,不做回收。
  2. 表的附属对象,比如 trigger,Foreign key,column statistics等,只要存在可能修改表数据的,做删除,
    比如 trigger,Foreign key。 但columns statistics不做清理,随表进入回收站。

2. 清理机制

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

Recycle schema 和权限控制

1. recycle schema
MySQL 系统启动的时候,会初始化一个 recycle bin 的schema, 命名为 "__recycle_bin__", 作为回收站使用的专有 database。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| __recycle_bin__    |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

2. 权限控制

Database 权限:
recycle_bin 作为回收站的 schema,是系统级 database,没有权限做修改和删除。
用户无法使用drop table / database 来操作回收站。
比如:

mysql> drop table __recycle_bin__.__innodb_1064;
ERROR 1044 (42000): Access denied for user 'b1'@'%' to database '__recycle_bin__'

recycled table 权限:

-- recycle scheduler 后台线程具有所有权限,可以做清理工作;
-- 用户虽然无法直接 drop table,可以使用 dbms_recycle.purge_table(),

但仍然需要原表和回收站表都具有 DROP_ACL 权限:

比如:

mysql> call dbms_recycle.purge_table("__innodb_1064");
ERROR 1142 (42000): DROP command denied to user 'b1'@'localhost' for table '__innodb_1064'

-- Grant 回收站权限
mysql> grant drop on __recycle_bin__.__innodb_1064 to b1@'%';
Query OK, 0 rows affected (0.00 sec)
-- Grant 原表权限
mysql> grant drop on product_db.t2 to b1@'%';
Query OK, 0 rows affected (0.00 sec)

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

Recycled table 命名规则
Recycled table 会从不同的 schema,回收到统一的 recycle bin 回收站中,所以需要保证目标表表名唯一,所以
这里定义了一个命名格式:

"__" + Storge Engine + SE private id

Storge Engine:代表存储引擎名称,比如 innodb。

SE private id:是存储引擎为每一个表生成的唯一值,比如 InnoDB 中,就是 table id,
以此来唯一表示一个表名称。

Recycled table 关联对象
在回收表的过程中,需要处理表的相关对象,其处理的原则是:

  1. 如果是表附属对象,可能会存在修改表数据的可能性,就做删除,比如 trigger 和 FK。
  2. 如果是表相关对象,不会修改数据,就不做清理,比如相关的 view,统计信息等。
    下面通过一个例子来看下:

原始结构

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (
    id INT,
    parent_id INT,
    self_id INT,
    INDEX id_ind (id),
    INDEX par_ind (parent_id),
    INDEX sel_ind (self_id),
    FOREIGN KEY (self_id) REFERENCES child(id),
    FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE=INNODB;

CREATE TABLE log(id INT);

delimiter //
CREATE TRIGGER trigger_child
  before INSERT ON child FOR EACH ROW
BEGIN
  INSERT INTO log value(1);
END//
delimiter ;

CREATE VIEW view_child AS SELECT * FROM child;

Drop 并回收(相关关联对象删除或失效)

1. 删除表 child;
mysql> drop table child;
Query OK, 0 rows affected (0.01 sec)

2. 查看回收站,及 child 表在回收站的结构
mysql> call dbms_recycle.show_tables();
+-----------------+---------------+---------------+--------------+---------------------+---------------------+
| SCHEMA          | TABLE         | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME       | PURGE_TIME          |
+-----------------+---------------+---------------+--------------+---------------------+---------------------+
| __recycle_bin__ | __innodb_1068 | test          | child        | 2019-08-08 12:32:48 | 2019-08-15 12:32:48 |
+-----------------+---------------+---------------+--------------+---------------------+---------------------+

mysql> show create table __recycle_bin__.__innodb_1068\G
*************************** 1. row ***************************
       Table: __innodb_1068
Create Table: CREATE TABLE `__innodb_1068` (
  `id` int(11) DEFAULT NULL,
  `parent_id` int(11) DEFAULT NULL,
  `self_id` int(11) DEFAULT NULL,
  KEY `id_ind` (`id`),
  KEY `par_ind` (`parent_id`),
  KEY `sel_ind` (`self_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

-- 相关的 Foreign key 已经全部删除。

3. 查看相关trigger。
mysql> show create trigger trigger_child;
ERROR 1360 (HY000): Trigger does not exist

-- 相关的trigger已经全部删除。

4. 查看相关view。
mysql> show create view view_child\G
*************************** 1. row ***************************
                View: view_child
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_child` AS select `child`.`id` AS `id`,`child`.`parent_id` AS `parent_id`,`child`.`self_id` AS `self_id` from `child`
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
1 row in set, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+-----------------------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                                           |
+---------+------+-----------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1356 | View 'test.view_child' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them |
+---------+------+-----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

-- 相关的view 已经失效。

Master-slave 独立回收

在 master - slave 结构中, 是否回收,或回收站保留的周期,都是实例本身的设置,不会影响到 binlog 复制到的节点上,所以,我们可以在 master 节点上设置回收,保留 7 天周期,在slave 节点上,设置回收,保留14天周期。
比如
master:

--recycle_bin = on
--recycle_bin_retention = 7 * 24 * 60 * 60

master节点上,回收站保留 7 天

slave:

--recycle_bin = on
--recycle_bin_retention = 14 * 24 * 60 * 60

slave 节点上,回收站保留 14 天

要注意的点就是,回收站保留周期不同,将导致 master - slave 节点之间的空间占用差别比较大。

异步表清理和大文件删除

当 recycle scheduler 异步线程 purge 回收站的表时候,如果遇到大表,那么将会启动大表异步删除逻辑,相关参数如下:

INNODB_DATA_FILE_PURGE: Whether enable the async purge strategy
INNODB_DATA_FILE_PURGE_IMMEDIATE: Unlink data file rather than truncate
INNODB_DATA_FILE_PURGE_ALL_AT_SHUTDOWN: Cleanup all when normal shutdown
INNODB_DATA_FILE_PURGE_DIR: Temporary file directory
INNODB_DATA_FILE_PURGE_INTERVAL: Purge time interval (by milliseconds)
INNODB_DATA_FILE_PURGE_MAX_SIZE: Purge max size every time (by MB)
INNODB_PRINT_DATA_FILE_PURGE_PROCESS: Print the process of file purge worker

比如设置:

set global INNODB_DATA_FILE_PURGE = on;
set global INNODB_DATA_FILE_PURGE_INTERVAL = 100;
set global INNODB_DATA_FILE_PURGE_MAX_SIZE = 128;

每 100ms,删除 128MB 大小。

可以通过如下视图,查看大表异步删除的进展情况:

mysql> select * from information_schema.innodb_purge_files;
   +--------+---------------------+--------------------------------------+---------------+------------------------+--------------+
   | log_id | start_time          |          original_path               | original_size | temporary_path         | current_size |
   +--------+---------------------+--------------------------------------+---------------+------------------------+--------------+
   |     36 | 2019-08-08 12:06:38 | ./__recycle_bin__/__innodb_1064.ibd  |      37748736 | purge/#FP_1557846107_1 |     20971520 |
   +--------+---------------------+--------------------------------------+---------------+------------------------+--------------+

注意事项

1,回收站跨文件系统
如果你的回收站目录 "__recycle__bin_"_ 和回收的表跨了文件系统,那么drop table,将会搬迁表空间文件,耗时较长。

2,General tablespace
general tablespace 会存在多个表共享同一个表空间的情况, 当回收其中一张表的时候,不会搬迁相关的表空间文件,如果master 和 slave 设置的回收保留时间不同,那么就会存在在某一个时间点,主备间的这个general tablespace中的表数量不相等的情况。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云MySQL云数据库和Redis6.0数据库使用体验
阿里云MySQL云数据库和Redis6.0数据库使用体验
184 0
数据零丢失! 阿里云数据库RDS for MySQL 三节点企业版正式商用!
每个事务日志确保至少同步两个节点,实现任意节点宕机后数据零丢失,数据库整体RPO为0!
5202 0
阿里云批量计算怎么在控制台提交和管理作业?
阿里云批量计算(BatchCompute)是一种适用于大规模并行批处理作业的分布式云服务。 用户可以提交一个任意的计算机程序,让它在阿里云的多个 VM 实例上同时运行,然后把结果写入到指定的持久化存储位置(如阿里云对象存储 OSS 或者文件存储 NAS)。
1340 0
为更强大而生的开源关系型数据库来了!阿里云RDS for MySQL 8.0 正式上线!
2019年5月29日15时,阿里云RDS for MySQL 8.0正式上线,使得阿里云成为紧跟社区步伐,发布MySQL最新版本的云厂商。RDS for MySQL 8.0 产品是阿里云推出的 MySQL 系列云产品之一,使用完全兼容 MySQL 8.0 的阿里云 AliSQL 8.0 分支,除了官方在 MySQL 8.0 推出的全新功能外,AliSQL 沉淀了许多在 Alibaba 集团电商业务和云上几十万客户在使用 MySQL 过程中遇到的问题和需求,以此来加固AliSQL, 提升 AliSQL 的性能和稳定性。
10820 0
教你如何在阿里云服务器上安装Mysql数据库(mysql5.7.23+centos)
对于一个建站新手来讲,最重要的莫过于2件事  1.时间效率 2.性价比 换句话讲,对于非专业选手,在整个建站过程,如何省时省力,用相对简单的方式,花更少的钱建好网站是关键。 基于上述,给大家带来一版适合新手的建站指南,供大家参考。
3735 0
阿里云新一代云服务器即将上线,计算、存储、网络全面升级
4月2日,据阿里云透露,其全新一代企业级ECS以及弹性裸金属云服务器即将上线。
2235 0
阿里云物联网边缘计算加载MQTT驱动
本文在LinkEdge快速入门样例驱动的基础上,加载了MQTT订阅的客户端,使得边缘端容器可以通过MQTT获得外部数据。
2474 0
MS SQL监控数据库的DDL操作
前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理起来就会相当麻烦,容易产生混乱,如果数据库管理员不监控数据库架构变更的话,就不知道谁对数据库架...
983 0
+关注
204
文章
1
问答
来源圈子
更多
让用户数据永远在线,让数据无缝的自由流动
+ 订阅
相关文档: 云数据库 OceanBase 版 可信账本数据库 云原生关系型数据库 PolarDB PostgreSQL引擎
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载