mysql删除分区表_MySQL中的分区表(下)
关注我「程序猿集锦」,获取更多分享。
分区表的管理
range和list分区
添加分区
删除分区
修改分区
合并或拆分分区
hash和key分区
添加分区
删除分区
修改分区
合并或拆分分区
分区的维护
重建分区
优化分区
分析分区
检查分区
修复分区
分区表的注意事项
总结
关于分区表的的分类和⽰例,请参考上篇⽂章。
分区表的管理
range和list分区
对于range和list两种类型的分区表的管理,接下来的各种演⽰⽰例:添加分区、删除分区、修改分区、合并拆分分区的各种操作,都是基于
下⾯的这个range范围分区表来做演⽰,list类型的分区操作类似。
这个range范围分区表的建表语句和初始化数据如下所⽰:
/*创建range范围分区表*/drop table if exists range_partition_table;create table range_partition_table(id int auto_increment, code varchar(16), create_date date, p 原始range分区表的详细信息如下图所⽰:
添加分区
这⾥管理分区部分,我们都使⽤range范围分区来做演⽰,
如果要添加⼀个分区,则只需如下的SQL语句
alter table range_partition_table add partition (partition p5 values less than ('2020-06-01'));
在添加分区的时候,需要注意如果你的分区表类型是range范围分区,并且制定了最后⼀个范围分区的范围边界为maxvalue,那么你不能
直接在这样的⼀个range范围分区表上增加分区,否则会出现如下的错误:
mysql> alter table range_partition_table add partition (partition p5 values less than ('2020-06-01'));ERROR 1493 (HY000): VALUES LESS THAN value mu
对于这样的情况,你只能针对倒数第⼆个分区拆分为⼀个新的分区。或者是删除掉最后⼀个分区。然后执⾏add partition的操作,但是这样
将会丢失最后⼀个分区的数据,所以不建议这么做。最好的办法是在创建range范围分区的时候,不要使⽤maxvalue作为最后⼀个分区的
边界值,当我们发现分区不够的时候,就可以直接使⽤add partition语句增加分区了。如下所⽰:
mysql> /*删除掉最后⼀个包含maxvalue的范围分区后,再添加分区是可以成功的。*/mysql> alter table range_partition_table drop partition px;Query OK, 0 rows affe
对于列表分区来说,可以就没有range范围分区遇到的这个问题了,可以直接使⽤add partition语句进⾏添加分区的操作。只要添加的分区
中的value,不和已经存在的分区有任何交集就可以。
删除分区
如果想要删除⼀个或多个分区,可以使⽤如下的语句:
alter table range_partition_table drop partition p1; /*删除⼀个分区,数据和分区都会被⼲掉*/alter table range_partition_table drop partition p1, p2; /*删除多个分区,
当你删除⼀个分区的时候,这个分区内所存储的数据也会被⼀并删除,这对⼀个普通的⾮分区表执⾏drop table xx的效果是⼀样的。所
以,在删除分区之前⼀定要想清楚是否确定要删除这个分区。同时当你想删除某个分区的时候,你还需要对这个分区表有drop的权限才可
以。
删除分区的语句仅适⽤于range分区和list分区,不适⽤于hash分区和key分区。如果尝试对⼀个hash分区使⽤drop partition语句的操
作,会出现如下错误信息:
mysql> alter table hash_partition_table drop partition p1;ERROR 1512 (HY000): DROP PARTITION can only be used on RANGE/LIST partitionsmysql>
如果你只是想删除数据,⽽不想删除分区,则只需如下的truncate partition语句:
alter table range_partition_table truncate partition p1; /*删除⼀个分区内的数据,分区会被保留*/
如果你要删除分区表中所有的数据,同时保留分区信息不被删除,使⽤如下的truncate table语句。
truncate table range_partition_table; /*把表中所有数据都⼲掉,分区信息会被保留*/
修改分区键
如果原先的涉及到分区表不够好,想重新选择⼀个新的分区键,或者是我们原先使⽤的分区类型不够好,先换⼀个分区类型。我们该如何操作?最简单⽅式并不是我们⾸先想到的重新创建⼀个新的分区表,然后后把数据导⼊到新的分区表中,再把旧表删除掉,在把新的分区表的名称改为旧的分区表的名称。这种⽅式当然可以,但是除了这种⽅式之外,我们还可以使⽤下⾯的语句来完成分区表的修改。
可以使⽤如下SQL语句把分区键进⾏更改,这样数据会根据新的分区键还有分区规则重新分布:
alter table range_partition_tablepartition by range columns(id)(partition p1 values less than (5), partition p2 values less than (10), partition px values less 上述SQL执⾏完成后,表的分区结构如下所⽰:
基于修改后的SQL语句,我们还可以使⽤如下的SQL对分区表的类型进⾏修改,如下的SQL语句是把⼀个range范围分区表改为⼀个hash
分区表。
alter table range_partition_tablepartition by hash(id)partitions 4;
上述的SQL执⾏完成后,表的分区信息如下所⽰:
在上⾯的实验中,我们把⼀个range分区的表,显⽰修改了它的分区键,接着⼜把这个range分区表改为了hash分区表。可以发现数据是不会丢失的,并且可以根据我们修改的时候指定的分区键和分区规
则⾃动的对原先的range分区表中的数据进⾏重新分区存储。
mysql下载哪个盘合并或拆分分区
我们可能会有这样的需求:想把已经存在的两个分区合并为⼀个分区,或者是想把⼀个已经存在的分区拆分为两个分区。此时我们就不能直接使⽤add parition和drop partition两种命令的组合来实现,因为在我们执⾏drop partition的时候,会把数据也删除掉了。此时我们使
⽤alter table xx reorganize partition语句来实现这样的需求。
我们下⾯的拆分分区和合并分区的操作都将基于前⾯我们提到的range范围分区表来演⽰。
把两个分区合并为⼀个分区的SQL语句如下,此时分区合并,并且数据不会丢失。两个分区内的数据会根据分区的规则,⾃动的合并在⼀个分区中。在合并分区的时候,不能把间隔的两个分区合并为⼀个分区。⽐如把p1和p3合并为⼀个分区,因为中间还有⼀个分区p2。所以不能间隔着分区操作。同时,使⽤reorganize命令不能把分区类型修改掉,⽐如把range分区修改为list分区。
alter table range_partition_table reorganize partition p1,p2 into ( partition p1_and_p2 values less than('2020-03-01'));
把⼀个分区拆分为两个分区的语句如下:
alter table range_partition_table reorganize partition p4 into ( partition p4_1 values less than('2020-04-15'), partition p4_2 values less than('2020-05-01')
经过上⾯两步合并和拆分分区的操作之后,结果如下。我们可以看到分区p1和p2已经合并为⼀个分区p1_and_p2。分区p4也被拆分成了
两个分区:p4_1和p4_2。但是每⼀个分区的数据量重下⾯的截图中可以看到还有些不对,但是我们把分区表执⾏⼀下分析命令之后就可以看到正确的统计结果了。
执⾏如下命令,再次查看修改后的分区详细信息如下:
analyze table range_partition_table;
hash和key分区
我们基于下⾯的这个hash分区表来做演⽰
drop table if exists hash_partition_table;create table hash_partition_table(id int auto_increment, store_code int, create_date date, primary key(id, store_c 对hash分区表,插⼊测试数据如下所⽰:
insert into hash_partition_table(id, store_code, create_date) values(null, 10, now());insert into hash_partition_table(id, store_code, create_date) values(nu 查询hash分区后的详细信息如下:
添加分区
把原先4个hash分区的分区表,增加2个hash分区,使⽤如下的SQL语句:
alter table hash_partition_table add partition partitions 2;
添加2个hash分区后的结果如下所⽰,我们可以发现原的4个分区下载变成了6个分区
删除分区
基于上⾯添加后的分区表,把现在6个hash分区的分区表,减少4个hash分区,调整为2个分区,使⽤如下的SQL:
alter table hash_partition_table coalesce partition 4;
最后结果如下所⽰,可以看到分区已经调整为2个分区,并且数据也没有丢失,这就是hash、key分区和range、list分区⼀个⽐较明显的区别:删除分区后,hash、key分区中的数据不会丢失,⽽range、list分区中的数据会随着分区的删除⽽⼀起别删除。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论