【原】阿里云RDS数据库超大表分区实现

时间:2024-01-20 21:23:55

[背景]

  1. 一张数据量约1亿条数据的表,由于最初设计疏忽,未做分区,现需要根据创建时间字段来做分区;
  2. 业务要求,该表仅需要保留3个月的数据,数据量在9千万~1亿3千万左右;
  3. 业务允许短时间停机,10分钟左右;
  4. 该表数据,仅最近14天左右数据会有更新操作,其余数据为统计查询;
  5. 原表创建时间用的timestamp,无法作为分区字段;
  6. ID为主键;

[RDS信息]

  1. 数据库类型:MySQL 5.6;
  2. CPU:8核;
  3. 最大连接数:8000;
  4. 最大IOPS:12000;

[解决思路]

  1. 创建新的分区表,与原表保持同样的结构,将创建时间类型改为datetime;
  2. 分批写入历史数据,每次1000万,大约7分钟时间;(查出最近14天会更新的最小ID,这批数据停机插入!
  3. 停机插入最后的14天数据;
  4. Rename表,重启服务;

insert my_table_temp
select *
  from my_table
 where id>= 150000000
   and id< 160000000;
RENAME TABLE my_table TO my_table_to_delete;
RENAME TABLE my_table_temp TO my_table ;
DROP TABLE my_table_to_delete;

 

 

[总结]

这种方案还是有些限制的,比如能段时间停服务,且有明确历史数据不会更新,否则可能需要添加trigger来解决了。

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) 
https://www.cnblogs.com/cooqer/p/9139873.html
出自【Cooqer的博客】