[MYSQL] mysql添加分区忘记写add会怎么样?

2024-07-28 16:20:23 浏览数 (1)

导读

昨天风(上海)贼大. 愉快的周末从加班开始就不那么愉快了. 这里简单记录一下(不含实际信息, 均为测试模拟的信息).

案例过程

起初应用跑DDL (alter table table_name add partition (partition xx);) 成功. 此时业务正常的. 于是应用就像把后面的分区提前建好. 使用了如下的SQL

代码语言:sql复制
alter table table_name partition (partition xx);

因为不含add关键词, 就导致重建了该表, 之前的分区信息都没了. 好巧不巧, 应用的DML语句是指定了分区的, 比如insert into db1.employees partition (p0) values(1,1,1,1,1,1,1); 于是就会收到如下报错(影响业务使用):

代码语言:txt复制
ERROR 1735 (HY000): Unknown partition 'p0' in table 'employees'

分区不存在, 那就加呗. 比如:

代码语言:sql复制
(root@127.0.0.1) [(none)]> alter table db1.employees add partition (partition p0 values less than (4));
ERROR 1493 (HY000): VALUES LESS THAN value must be strictly increasing for each partition
(root@127.0.0.1) [(none)]> 

根据描述来看, 分区应该是只能往后加 (strictly increasing). 也就是只能重建表了.

代码语言:sql复制
CREATE TABLE employees (
id int,
store_id int
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (4),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN (21)
);

重建后业务恢复正常.

总结

敲命令的时候一定要看仔细. 这次虽然没有丢数据, 但还是影响了业务使用. 不只是是数据库, linux上也是. 写脚本也是. 再进行一些修改(非只读)命令时, 记得做好备份和检查, 比如: 删除文件 就先 test -f filename 看下是否存在. 尤其是有变量的时候, 尽量进到目录里面去再删除. (关于文件名字处理的相关shell之前有发过, 感兴趣的自己去翻翻).

扯远了, 这次只是个修改分区的,而且是周末, 所以影响还算比较小. 但还是要多检查下. 最好是先在测试环境测试下, 不能光看是否报错, 还得看结果是否符合预期.

0 人点赞