几种常见的MySQL/PolarDB-MySQL回收表空间方法对比

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 当我们频繁的删除表中的数据后,碎片就会变多,有经验的DBA就会回收表空间,回收表空间有好几种方式,我们要选择哪一种呢?

背景

为什么需要回收表空间?任何一个存储或您购买的实例规格都有容量限制,并且根据存储介质不同,保存方式不同,相应地成本也会不同。在线数据库的存储成本是比较高的,所以架构师和DBA在系统设计之初就要考虑满足未来几年内的业务需求,同时又能最大化地节省成本,这是比较合理的架构布局和容量规划的方法。而大多数系统是没有经过以上步骤直接上线的,这种随着业务的发展在线数据会保留的越来越多,当存储容量不够时可以通过升级实例规格或硬件解决,但如果没有更大的规格时,只能删除数据回收表空间了。

回收表空间的常见方法

在删除回收表空间时,通常有以下几种方法:

编号

删除方法

回收方法

适合场景

1

  1. CREATE TABLE A' LIKE A;
  2. INSERT INTO A' SELECT * FROM A WHERE ;
  3. DROP TABLE A;
  4. RENAME TABLE A' TO A;

DROP TABLE A;

保留数据少,删除数据多;但要极短时间暂停源表上的数据写入(通常毫秒级别完成);

可能会引起性能抖动

2

  1. DELETE * FROM A WHERE ;
  2. ALTER TABLE A ENGINE=INNODB;/OPTIMIZE TABLE A;

ALTER TABLE A ENGINE=INNODB;/OPTIMIZE TABLE A;

保留数据多,删除数据少;建议DELETE时用DMS的无锁数据变更(参考https://help.aliyun.com/document_detail/162507.html),否则DELETE时也可能引起性能抖动

可能会引起性能抖动

3

ALTER TABLE A DROP PARTITION partition_name;

ALTER TABLE A DROP PARTITION partition_name;

分区表

可能会引起性能抖动

4

DROP TABLE A_0000/A_20100101;

DROP TABLE A_0000/A_20100101;

已经人为分表存储设置,如:按取模或日期分表

可能会引起性能抖动

针对DROP TABLE A可能会带来的性能抖动可以通过阿里云内核经过特殊优化Purge Large File Asynchronously(https://help.aliyun.com/document_detail/134095.html)默认已经打开。而对于ALTER TABLE的操作,目前业界开源的有gh-ost、pt-online-schema-change和OnlineSchemaChange

,阿里云RDS MySQL也专门研发了无锁结构变更。本文针对几种常见的表空间回收的方式做了测试,希望给开发或运维人员提供更稳定的变更参考方式,保障生产环境的稳定性。

各类工具对比

  1. 比pt-online-schema-change的trigger对原表影响较小

pt-online-schema-change的工作原理是创建和源表A一样的表A_gst执行DDL操作,同时在A上创建一个DML触发器,然后将A中的数据拷贝到A_gst,在拷贝过程中产生的增量变更就用触发器完成同步更新。拷贝结束后执行两张表的rename操作完成变更。

  1. OnlineSchemaChange

工作原理和pt-online-schema-change基本一致,不同的地方是它采用的是异步模式,在A_gst的基础上创建了一张日志表,触发器的条目更新将直接落在日志表中,后台进程将日志表中的条目应用到A_gst表。这样整个流程上是异步的,也能够控制回放速度。

  1. gh-ost

与上面两种变更流程基本一致,但是没有使用触发器的设计,所以增量变更的数据来源不是触发器,而是Binlog文件。订阅读取该文件中A表的变更记录,将记录解析并应用到A_gst表。这样的数据对于gst表回放非常有利,binlog中存储的都是A表的记录,易于直接读取和应用。

  1. DMS的无锁结构变更

采用了无触发器的设计,能有效解决触发器设计带来的锁、数据库开销等问题。同时和DTS的联动,执行表空间回收时会把临时表也传送到DTS,这样DTS的同步下游链路不会中断。

为了验证DMS的无锁变更的稳定性,做了4次测试分别是:

  • 编号34221蓝色曲线,基准oltp_insert测试作为对比基线;
  • 编号34222绿色曲线,基准oltp_insert测试+DMS的无锁变更+ALTER TABLE [tbname] ENGINE=INNODB;
  • 编号34237黄色曲线,基准oltp_insert测试+关闭DMS的无锁变更+RDS kernel ALTER TABLE [tbname] ENGINE=INNODB;
  • 编号34239灰色曲线,基准oltp_insert测试+关闭DMS的无锁变更+RDS kernel OPTIMIZE TABLE [tbname];

以蓝色基线为基准,从图中可以看出绿色曲线相较于同样是执行回收表空间的黄色和灰色平稳,但持续时间较长;绿色、黄色、灰色曲线到最后都会临时表重命名成正式表的过程,最多2s。

测试结论

结合实际业务来说推荐性能比较稳定的DMS无锁变更+ALTER TABLE。使用DMS的无锁变更可以打开DMS控制台,在页面顶部,选择全部功能 > 数据方案 > 无锁变更

注意事项

  1. 不支持字符串类型的主键(dms是一块一块的拷贝,最大值和最小值确定拷贝范围,然后分成若干块拷贝,会用到很多min max计算范围的SQL)

参考

如何用DMS进行无锁结构变更(https://help.aliyun.com/document_detail/98373.html)

关于optimize和alter的原理(https://developer.aliyun.com/article/579242)


相关实践学习
MySQL基础-学生管理系统数据库设计
本场景介绍如何使用DMS工具连接RDS,并使用DMS图形化工具创建数据库表。
相关文章
|
3月前
|
关系型数据库 MySQL 索引
MySQL的全文索引查询方法
【8月更文挑战第26天】MySQL的全文索引查询方法
53 0
|
1月前
|
存储 关系型数据库 MySQL
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
100 1
|
1月前
|
存储 关系型数据库 MySQL
提高MySQL查询性能的方法有很多
提高MySQL查询性能的方法有很多
165 7
|
3月前
|
存储 关系型数据库 MySQL
mysql数据库查询时用到的分页方法有哪些
【8月更文挑战第16天】在MySQL中,实现分页的主要方法包括:1)使用`LIMIT`子句,简单直接但随页数增加性能下降;2)通过子查询优化`LIMIT`分页,提高大页码时的查询效率;3)利用存储过程封装分页逻辑,便于复用但需额外维护;4)借助MySQL变量实现,可能提供更好的性能但实现较复杂。这些方法各有优缺点,可根据实际需求选择适用方案。
387 2
|
14天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的表空间
InnoDB是MySQL默认的存储引擎,主要由存储结构、内存结构和线程结构组成。其存储结构分为逻辑和物理两部分,逻辑存储结构包括表空间、段、区和页。表空间是InnoDB逻辑结构的最高层,所有数据都存放在其中。默认情况下,InnoDB有一个共享表空间ibdata1,用于存放撤销信息、系统事务信息等。启用参数`innodb_file_per_table`后,每张表的数据可以单独存放在一个表空间内,但撤销信息等仍存放在共享表空间中。
|
1月前
|
SQL 存储 关系型数据库
MySQL 回收表碎片实践教程
在 MySQL 数据库中,随着数据的增删改操作,表空间可能会出现碎片化,这不仅会占用额外的存储空间,还可能降低表的扫描效率,特别是一些大表,在进行数据清理后会产生大量的碎片。本篇文章我们一起来学习下如何进行碎片回收以及相关注意点。
68 1
MySQL 回收表碎片实践教程
|
23天前
|
关系型数据库 MySQL
Mysql 中日期比较大小的方法有哪些?
在 MySQL 中,可以通过多种方法比较日期的大小,包括使用比较运算符、NOW() 函数、DATEDIFF 函数和 DATE 函数。这些方法可以帮助你筛选出特定日期范围内的记录,确保日期格式一致以避免错误。
|
2月前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
141 4
|
2月前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
35 4
|
2月前
|
关系型数据库 MySQL Unix
MySQL配置不区分大小写的方法
结论 通过适当配置 lower_case_table_names参数以及在数据定义和查询中选择合适的校对规则,可以灵活地控制MySQL中的大小写敏感性,以适应不同的应用场景和需求。这样的设置既可以增加数据库的兼容性,又可以在必要时利用大小写敏感性进行精确的数据处理。需要注意的是,修改 lower_case_table_names参数后,最好在数据库初始化时进行,以避免现有表名的大小写问题。
320 3
下一篇
无影云桌面