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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
数据管理 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)


相关文章
|
1月前
|
关系型数据库 MySQL 数据库连接
关于MySQL-ODBC的zip包安装方法
关于MySQL-ODBC的zip包安装方法
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
99 1
|
1月前
|
SQL 关系型数据库 MySQL
MYSQL分页limit速度太慢优化方法
MYSQL分页limit速度太慢优化方法
31 0
|
14天前
|
关系型数据库 MySQL Linux
linux CentOS 7.4下 mysql5.7.20 密码改简单的方法
linux CentOS 7.4下 mysql5.7.20 密码改简单的方法
17 0
|
2月前
|
SQL NoSQL 关系型数据库
关系型数据库管理系统Mysql
关系型数据库管理系统Mysql
|
1月前
|
数据可视化 关系型数据库 MySQL
PolarDB常见问题之无法创建mysql的连接池如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
1月前
|
存储 关系型数据库 MySQL
TiDB与MySQL、PostgreSQL等数据库的比较分析
【2月更文挑战第25天】本文将对TiDB、MySQL和PostgreSQL等数据库进行详细的比较分析,探讨它们各自的优势和劣势。TiDB作为一款分布式关系型数据库,在扩展性、并发性能等方面表现突出;MySQL以其易用性和成熟性受到广泛应用;PostgreSQL则在数据完整性、扩展性等方面具有优势。通过对比这些数据库的特点和适用场景,帮助企业更好地选择适合自己业务需求的数据库系统。
|
1月前
|
canal 关系型数据库 MySQL
四种常用的 MySQL 数据同步 ES 的方法
【2月更文挑战第16天】
176 2
四种常用的 MySQL 数据同步 ES 的方法
|
1月前
|
关系型数据库 MySQL 分布式数据库
PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
【2月更文挑战第16天】PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
24 1
|
1月前
|
SQL 存储 关系型数据库
MySQL 常用30种SQL查询语句优化方法
MySQL 常用30种SQL查询语句优化方法
73 0

热门文章

最新文章