今天 一个小伙伴过来找我,说mysql建分区表时遇到奇怪的问题。
场景大概如下:表中先有数据,现在考虑建分区,结果连续建了两个分区后,开始往分区表中插入数据,能入成功,但是通过数据字典查询时却查询不到,后来他又尝试着新添加两个分区,但是发现添加分区失败了。
后来经过和他一起排查,才发现,原来分区建立失败的原因即然是语法错误导致的。
之前由于一般都是先规划分区表,才开始写数据,所以很暂时没想到会是这个场景 ,也就借此还原一下他所反应的问题。
测试过程如下:
1.建立原有表:
CREATE TABLE test01 (
dayid int,
`mac` varchar(32) NOT NULL DEFAULT '',
`dtype` varchar(50) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
并往里面插入10000条数据;
2.开始针对dayid建立List分区。
alter table test01 partition by list(dayid) (partition p20171205 values in (20171205));
最新的分区表如下:
CREATE TABLE `test01` (
`dayid` int(11) DEFAULT NULL,
`mac` varchar(32) NOT NULL DEFAULT '',
`dtype` varchar(50) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY LIST (dayid)
(PARTITION p20171205 VALUES IN (20171205) ENGINE = InnoDB,
PARTITION p20171204 VALUES IN (20171204) ENGINE = InnoDB,
PARTITION p20171206 VALUES IN (20171206) ENGINE = InnoDB,
PARTITION p20171207 VALUES IN (20171207) ENGINE = InnoDB) */
3.详细的分区表信息如下,每一个分区都都建立了一个子表 ,而且数据已经全部写到分区子表中。
12K test01.frm
4.0K test01.par
96K test01#P#p20171204.ibd
9.0M test01#P#p20171205.ibd
96K test01#P#p20171206.ibd
96K test01#P#p20171207.ibd
4.直接从数据字典表中去查询分区数据,发现数据已经直接自动同步到分区表中,并且从文件大小看,数据确实已经同步过去了。
from information_schema.partitions
where table_name = 'test01';
+----------------+------------+
| partition_name | table_rows |
+----------------+------------+
| p20171205 | 10031 |
| p20171204 | 0 |
| p20171206 | 0 |
| p20171207 | 0 |
+----------------+------------+
5. 而且mysql还提供了rebuild语法,使用方法如下:
alter table tets01 rebuild p20171204,p20171205,p20171206,p20171207.