MySQL 新增表分区很慢,转移大表数据

问题:

MySQL (version 5.7.26) 数据库有一批表 xxx_yyy,由于评估的数据量可能比较大,因此每张表都设置了表分区,把每个月的数据保存在单独的分区里。

那么如果每年年末,没有提前创建好第二年的表分区,当第二年的数据写入时,就会出现以下报错:

ERROR 1526 (HY000): Table has no partition for value from column_list

 

解决:

今年的表分区忘了创建,因此需要批量对以 xxx_ 开头的表创建分区。执行开发提供的存储过程 tmp_addpart("20220101", "20201231") 将遍历指定的表,依次创建表分区。

经过观察,1G 数据的表新建一年的 12 个分区大约需要 6 分钟。观察到还有一些大表(数据亿条以上,大小超过 10G)。

耗时的原因是:如果分区字段不在主键内,需要对表进行主键重建。如果按照大表的数据量,主键重建的速度会非常非常慢。

因为这些表算是中间表,除非重新回溯计算,否则不太会用到历史数据。因此考虑将这些大表的数据进行备份(简单点,直接对表重命名,再创建一个新表)。

RENAME TABLE xxx_yyy TO old_xxx_yyy
CREATE TABLE xxx_yyy LIKE old_xxx_yyy
DESCRIBE xxx_yyy

 

就先这样临时解决吧~

—END—

posted @ 2022-01-04 14:14  Cathon  阅读(914)  评论(0编辑  收藏  举报