背景
线上数据空间告警, 需要进行相关处理。
方案
- 无脑扩容
优点:简单快速。缺点:对于单体数据库容量会存在上限, 如果不断增长会导致无法扩容。单表数据量过大会影响查询性能。浪费资源。
- 数据归档
针对具体业务进行分析, 是否可以历史的一些数据进行删除, 来减少使用的空间
- 分库分表
对于无法归档的任务则需要进行相应的分库、分表操作。能够突破单体数据库对容量的限制, 也不影响查询性能。缺点就是需要相关的改造。
处理过程
这里就简单聊一下数据归档需要做哪些事情。
- 空间分析
看看数据库中的哪些表占用了大量的空间。
SELECT
TABLE_SCHEMA, -- 数据库名称
TABLE_NAME, -- 表名
ENGINE, -- 引擎
TABLE_ROWS, -- 行数
DATA_LENGTH / 1024 / 1024 / 1024 as 'DATA_LENGTH(GB)', -- 表大小
DATA_FREE / 1024 / 1024 / 1024 as 'DATA_FREE(GB)' -- 碎片空间大小
FROM
INFORMATION_SCHEMA.tables
order by
DATA_LENGTH desc
limit
10
- 业务评估
找到 db 中的大表, 看下如果建立归档是否对业务产生影响, 同时确定归档条件。
- 建立归档任务
归档任务可以理解为就是一个定时任务, 定期执行 delete 语句。这里要注意, 执行 delete 语句时要分批次处理, 避免造成线上慢查。尽量将归档任务做的通用一点。例如:过滤条件, 执行时间, 批次删除数量, 批次间隔时长。
- 空间释放
在 mysql 中即使执行了 delete 语句, 我们可以看到数据库的存储空间并没有释放「mysql 本身机制的问题」。这时我们可以执行相关 DDL 语句对表进行重建, 释放对应的 data_freee. 当插入数据时, mysql 也会自动使用 delete 标记的空间
alter table ${table_name} engine = innodb;
总结
当数据量大了之后, 不可以避免的就会遇到各种各种样的问题。比如:存储资源不够用, 查询性能下降。这时候我们就要考虑进行改造。要么进行删除释放空间, 要么分库分表「本质上还是利用分布式的思想来解决单机的瓶颈」。