导读
昨天风(上海)贼大. 愉快的周末从加班开始就不那么愉快了. 这里简单记录一下(不含实际信息, 均为测试模拟的信息).
案例过程
起初应用跑DDL (alter table table_name add partition (partition xx);
) 成功. 此时业务正常的. 于是应用就像把后面的分区提前建好. 使用了如下的SQL
alter table table_name partition (partition xx);
因为不含add
关键词, 就导致重建了该表, 之前的分区信息都没了. 好巧不巧, 应用的DML语句是指定了分区的, 比如insert into db1.employees partition (p0) values(1,1,1,1,1,1,1);
于是就会收到如下报错(影响业务使用):
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之前有发过, 感兴趣的自己去翻翻).
扯远了, 这次只是个修改分区的,而且是周末, 所以影响还算比较小. 但还是要多检查下. 最好是先在测试环境测试下, 不能光看是否报错, 还得看结果是否符合预期.