MySQL数据库分区实战以及分区的管理_第1页
MySQL数据库分区实战以及分区的管理_第2页
MySQL数据库分区实战以及分区的管理_第3页
MySQL数据库分区实战以及分区的管理_第4页
MySQL数据库分区实战以及分区的管理_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 MySQL数据库分区实战以及分区的管理 MySQL 分区和分表知识总结日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。什么是分表?分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根

2、据事先定义好的规则得到对应的子表名,然后去操作它。什么是分区?分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。MySQL分表和分区有什么联系呢?1.都能提高MySQL的性高,在高并发状态下都有一个良好的表现。2.分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分

3、表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。3.分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系。4.表分区相对于分表,操作方便,不需要创建子表。分区又可以分为两种:水平分区(Horizontal Partitioning)这种形式分区是对表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。举个简单例子:一个包含十年发票记录的表可以被分区

4、为十个不同的分区,每个分区包含的是其中一年的记录。(注:这里具体使用的分区方式我们后面再说,可以先说一点,一定要通过某个属性列来分割,譬如这里使用的列就是年份)垂直分区(Vertical Partitioning)这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。举个简单例子:一个包含了大text和BLOB列的表,这些text和BLOB列又不经常被访问,这时候就要把这些不经常使用的text和BLOB了划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度。分区表的原理分区表是由多个相关的底层表实现,这些底层表

5、也是由句柄对象表示,所以我们也可以直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎),分区表的索引只是在各个底层表上各自加上一个相同的索引,从存储引擎的角度来看,底层表和一个普通表没有任何不同,存储引擎也无须知道这是一个普通表还是一个分区表的一部分。在分区表上的操作按照下面的操作逻辑进行:select查询:当查询一个分区表的时候,分区层先打开并锁住所有的底层表,优化器判断是否可以过滤部分分区,然后再调用对应的存储引擎接口访问各个分区的数据insert操作:当写入一条记录时,分区层打开并锁住所有的底层表,然后确定哪个分区接受这条记录,再将记录写

6、入对应的底层表delete操作:当删除一条记录时,分区层先打开并锁住所有的底层表,然后确定数据对应的分区,最后对相应底层表进行删除操作update操作:当更新一条数据时,分区层先打开并锁住所有的底层表,mysql先确定需要更新的记录在哪个分区,然后取出数据并更新,再判断更新后的数据应该放在哪个分区,然后对底层表进行写入操作,并对原数据所在的底层表进行删除操作虽然每个操作都会打开并锁住所有的底层表,但这并不是说分区表在处理过程中是锁住全表的,如果存储引擎能够自己实现行级锁,如:innodb,则会在分区层释放对应的表锁,这个加锁和解锁过程与普通Innodb上的查询类似。在下面的场景中,分区可以起到

7、非常大的作用:A:表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他都是历史数据B:分区表的数据更容易维护,如:想批量删除大量数据可以使用清除整个分区的方式。另外,还可以对一个独立分区进行优化、检查、修复等操作C:分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备D:可以使用分区表来避免某些特殊的瓶颈,如:innodb的单个索引的互斥访问,ext3文件系统的inode锁竞争等E:如果需要,还可以备份和恢复独立的分区,这在非常大的数据集的场景下效果非常好F:优化查询,在where字句中包含分区列时,可以只使用必要的分区来提高查询效率,同时在涉及sum()和c

8、ount()这类聚合函数的查询时,可以在每个分区上面并行处理,最终只需要汇总所有分区得到的结果。MySQL数据库的分区总是把null当作比任何非null更小的值,这和数据库中处理null值的order by操作是一样的,升序排序时null总是在最前面,因此对于不同的分区类型,mysql数据库对于null的处理也各不相同。对于range分区,如果向分区列插入了null,则mysql数据库会将该值放入最左边的分区,注意,如果删除分区,分区下的所有内容都从磁盘中删掉了,null所在分区被删除,null值也就跟着被删除了。在list分区下要使用null,则必须显式地定义在分区的散列值中,否则插入nul

9、l时会报错。hash和key分区对于null的处理方式和range,list分区不一样,任何分区函数都会将null返回为0.分区分区就是将数据库或其构成元素划分为不同的独立部分是一种预先组织表存储的方法mysql支持水平分区将特定表行分配为行的子集分区的分布是跨物理存储进行的根据用户在需要时设置的指定规则每个分区存储为其自己的单元数据的划分根据分区功能将数据划分为子集分区类型和表达式是表定义的一部分表达式可以是整数或返回整数值的函数。此值根据定义确定将每条记录存储在哪个分区中1.primary key和unique key必须包含在分区key的一部分,否则在创建primary key和uniq

10、ue index时会报”ERROR 1503 (HY000)“2.范围分区添加分区只能在最大值后面追加分区3.所有分区的engine必须一样4.范围分区分区字段:integer、数值表达式、日期列,日期函数表达式(如year(),to_days(),to_seconds(),unix_timestamp()分表的几种方式:1、MySQL集群它并不是分表,但起到了和分表相同的作用。集群可分担数据库的操作次数,将任务分担到多台数据库上。集群可以读写分离,减少读写压力。从而提升数据库性能。2、自定义规则分表分区的类型range 根据属于指定范围的列值将行分配到分区list 根据与离散值集之一匹配的列

11、将行分配到分区hash 基于由用户定义的表达式返回的值而选择的分区,对要插入表中的行的列值进行操作key 与hash类似,不同之处在于仅提供要评估的一个或多个列Composite(复合模式) 以上模式的组合使用InnoDB foreign keys and MySQL partitioning are not compatible. Partitioned InnoDB tables cannot have foreign key references, nor can they have columns referenced by foreign keys. InnoDB tables wh

12、ich have or which are referenced by foreign keys cannot be partitioned.分区的几种方式实践:Range:create table range(id int(11),money int(11) unsigned not null,date datetime)partition by range(year(date)(partition p2007 values less than (2008),partition p2008 values less than (2009),partition p2009 values less

13、 than (2010)partition p2010 values less than maxvalue);List:create table list(a int(11),b int(11)(partition by list (b)partition p0 values in (1,3,5,7,9),partition p1 values in (2,4,6,8,0);Hash:create table hash(a int(11),b datetime)partition by hash (YEAR(b)partitions 4;Key:create table t_key(a int

14、(11),b datetime)partition by key (b)partitions 4;分区管理新增分区ALTER TABLE sale_dataADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011);删除分区-当删除了一个分区,也同时删除了该分区中所有的数据。ALTER TABLE sale_data DROP PARTITION p201010;分区的合并下面的SQL,将p201001 - p201009 合并为3个分区p2010Q1 - p2010Q3ALTER TABLE sale_dataREORGANIZE P

15、ARTITION p201001,p201002,p201003,p201004,p201005,p201006,p201007,p201008,p201009 INTO(PARTITION p2010Q1 VALUES LESS THAN (201004),PARTITION p2010Q2 VALUES LESS THAN (201007),PARTITION p2010Q3 VALUES LESS THAN (201010);MySQL分区实战以及分区的管理CREATE TABLE part_tab( c1 int default NULL,c2 varchar(30) default

16、NULL,c3 date default NULL) engine=myisamPARTITION BY RANGE (year(c3) (PARTITION p0 VALUES LESS THAN (1995),PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) ,PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES LESS THAN (1999) ,PARTITION p5 VALUES LESS THAN (2000) ,

17、PARTITION p6 VALUES LESS THAN (2001) ,PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES LESS THAN (2003) ,PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES LESS THAN (2010),PARTITION p11 VALUES LESS THAN MAXVALUE );create table no_part_tab(c1 int(11) default NULL,c2 varchar(30) de

18、fault NULL,c3 date default NULL) engine=myisam;delimiter /CREATE PROCEDURE load_part_tab()begindeclare v int default 0;while v date 1995-01-01 and c3 date 1995-01-01 and c3 date 1995-01-01 and c3 date 1995-01-01 and c3 date 1995-12-31G垂直呢?alter table part_tab drop column c2;INNODB呢?CREATE TABLE part

19、_tab( c1 int default NULL,c2 varchar(30) default NULL,c3 date default NULL) engine=myisamPARTITION BY RANGE (year(c3) (PARTITION p0 VALUES LESS THAN (1995),PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) ,PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES LESS THA

20、N (1999) ,PARTITION p5 VALUES LESS THAN (2000) , PARTITION p6 VALUES LESS THAN (2001) ,PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES LESS THAN (2003) ,PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES LESS THAN (2010),PARTITION p11 VALUES LESS THAN MAXVALUE );insert into part_

21、tab select * from no_part_tab;alter table part_tab engine=innodb;1.RANGE分区基于属于一个给定连续区间的列值,把多行分配给分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。以下是实例。CREATE TABLE employees (id INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30),hired DATE NOT NULL DEFAULT 1970-01-01,separated DATE NOT NULL DEFAULT 9999-1

22、2-31,job_code INT NOT NULL,store_id INT NOT NULL)partition BY RANGE (store_id) (partition p0 VALUES LESS THAN (6),partition p1 VALUES LESS THAN (11),partition p2 VALUES LESS THAN (16),partition p3 VALUES LESS THAN (21);ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the tables partitio

23、ning function按照这种分区方案,在商店1到5工作的雇员相对应的所有行被保存在分区P0中,商店6到10的雇员保存在P1中,依次类推。注意,每个分区都是按顺序进行定义,从最低到最高。这是PARTITION BY RANGE 语法的要求;在这点上,它类似于C或Java中的“switch . case”语句。对于包含数据insert into employees values(72, Michael, Widenius, 1998-06-25, 9999-12-31, 13,7);的一个新行,可以很容易地确定它将插入到p2分区中,但是如果增加了一个编号为第21的商店,将会发生什么呢?在这种

24、方案下,由于没有规则把store_id大于20的商店包含在内,服务器将不知道把该行保存在何处,将会导致错误。要避免这种错误,insert into employees values(72, Michael, Widenius, 1998-06-25, 9999-12-31, 13,22);ERROR 1526 (HY000): Table has no partition for value 22可以通过在CREATE TABLE语句中使用一个“catchall” VALUES LESS THAN子句,该子句提供给所有大于明确指定的最高值的值:CREATE TABLE employees (i

25、d INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30),hired DATE NOT NULL DEFAULT 1970-01-01,separated DATE NOT NULL DEFAULT 9999-12-31,job_code INT NOT NULL,store_id INT NOT NULL)PARTITION BY RANGE (store_id) (PARTITION p0 VALUES LESS THAN (6),PARTITION p1 VALUES LESS THAN (11),PARTITION p2 VALUES LES

26、S THAN (16),PARTITION p3 VALUES LESS THAN MAXVALUE);MAXVALUE 表示最大的可能的整数值。现在,store_id 列值大于或等于16(定义了的最高值)的所有行都将保存在分区p3中。在将来的某个时候,当商店数已经增长到25, 30, 或更多 ,可以使用ALTER TABLE语句为商店21-25, 26-30,等等增加新的分区。在几乎一样的结构中,你还可以基于雇员的工作代码来分割表,也就是说,基于job_code 列值的连续区间。例如假定2位数字的工作代码用来表示普通(店内的)工人,三个数字代码表示办公室和支持人员,四个数字代码表示管理层,你

27、可以使用下面的语句创建该分区表:CREATE TABLE employees (id INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30),hired DATE NOT NULL DEFAULT 1970-01-01,separated DATE NOT NULL DEFAULT 9999-12-31,job_code INT NOT NULL,store_id INT NOT NULL)PARTITION BY RANGE (job_code) (PARTITION p0 VALUES LESS THAN (100),PARTITION p1 VA

28、LUES LESS THAN (1000),PARTITION p2 VALUES LESS THAN (10000);在这个例子中, 店内工人相关的所有行将保存在分区p0中,办公室和支持人员相关的所有行保存在分区p1中,管理层相关的所有行保存在分区p2中。在VALUES LESS THAN 子句中使用一个表达式也是可能的。这里最值得注意的限制是MySQL 必须能够计算表达式的返回值作为LESS THAN ()比较的一部分;因此,表达式的值不能为NULL 。由于这个原因,雇员表的hired, separated, job_code,和store_id列已经被定义为非空(NOT NULL)。除了

29、可以根据商店编号分割表数据外,你还可以使用一个基于两个DATE (日期)中的一个的表达式来分割表数据。例如,假定你想基于每个雇员离开公司的年份来分割表,也就是说,YEAR(separated)的值。实现这种分区模式的CREATE TABLE 语句的一个例子如下所示:CREATE TABLE employees (id INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30),hired DATE NOT NULL DEFAULT 1970-01-01,separated DATE NOT NULL DEFAULT 9999-12-31,job_code

30、INT,store_id INT)PARTITION BY RANGE (YEAR(separated) (PARTITION p0 VALUES LESS THAN (1991),PARTITION p1 VALUES LESS THAN (1996),PARTITION p2 VALUES LESS THAN (2001),PARTITION p3 VALUES LESS THAN MAXVALUE);在这个方案中,在1991年前雇佣的所有雇员的记录保存在分区p0中,1991年到1995年期间雇佣的所有雇员的记录保存在分区p1中, 1996年到2000年期间雇佣的所有雇员的记录保存在分区p

31、2中,2000年后雇佣的所有工人的信息保存在p3中。RANGE分区在如下场合特别有用:1)、 当需要删除一个分区上的“旧的”数据时,只删除分区即可。如果你使用上面最近的那个例子给出的分区方案,你只需简单地使用 “ALTER TABLE employees DROP PARTITION p0;”来删除所有在1991年前就已经停止工作的雇员相对应的所有行。对于有大量行的表,这比运行一个如“DELETE FROM employees WHERE YEAR (separated) = num: 设置 V = CEIL(V / 2) 设置 N = N & (V - 1) 例如,假设表t1,使用线性哈希分

32、区且有4个分区,是通过下面的语句创建的:CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY LINEAR HASH( YEAR(col3) ) PARTITIONS 6; 现在假设要插入两行记录到表t1中,其中一条记录col3列值为2003-04-14,另一条记录col3列值为1998-10-19。第一条记录将要保存到的分区确定如下:V = POWER(2, CEILING(LOG(2,7) = 8N = YEAR(2003-04-14) & (8 - 1)= 2003 & 7= 3(3 = 6 为假(FALSE):

33、 记录将被保存到#3号分区中)第二条记录将要保存到的分区序号计算如下:V = 8N = YEAR(1998-10-19) & (8-1)= 1998 & 7= 6(6 = 4 为真(TRUE): 还需要附加的步骤)N = 6 & CEILING(5 / 2)= 6 & 3= 2(2 = 4 为假(FALSE): 记录将被保存到#2分区中)按照线性哈希分区的优点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有极其大量(1000GA)数据的表。它的缺点在于,与使用常规HASH分区得到的数据分布相比,各个分区间数据的分布不大可能均衡。4.KSY分区类似于按HASH分区,区别在于KEY分区

34、只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。CREATE TABLE tk (col1 INT NOT NULL,col2 CHAR(5),col3 DATE)PARTITION BY LINEAR KEY (col1)PARTITIONS 3;在KEY分区中使用关键字LINEAR和在HASH分区中使用具有同样的作用,分区的编号是通过2的幂(powers-of-two)算法得到,而不是通过模数算法。分区表管理对指定表添加分区alter table user add partition(partition p4 values less than M

35、AXVALUE); /只能添加大于分区键的分区删除指定表指定分区alter table student drop partition p1;创建子分区create table role_subp(id int(20) not null,name int(20) not null)partition by list(id)subpartition by hash(name)subpartitions 3(partition p1 values in(10),partition p2 values in(20)复合分区alter table userreorganize partition p1,

36、p3 into(partition p1 values less than (1000);rebuild重建分区alter table xxxxxx rebuild partition pm1/all; /相当于drop所有记录,然后再reinsert;可以解决磁盘碎片优化表alter table tt2 optimize partition pm1; /在大量delete表数据后,可以回收空间和碎片整理。但在5.5.30后支持。在5.5.30之前可以通过recreate+analyze来替代,如果用rebuild+analyze速度慢analzye表alter table xxxxxx an

37、alyze partition pm1/all;show create table employees2; /查看分区表的定义show table status like employees2G; /查看表时候是分区表 如“Create_options: partitioned”selectfrom information_schema.KEY_COLUMN_USAGE where table_name=employees2; /查看索引SELECTFROM information_schema.partitions WHERE table_name=employees2 /查看分区表expl

38、ain partitions select * from employees2 where separated 2016-01-01; /查看分区是否被select使用分区管理和操作RANGE,LIST分区管理1:为未分区表创建分区ALTER TABLE trb3 PARTITION BY KEY(id) PARTITIONS 2;2:删除某个分区的数据ALTER TABLE tr DROP PARTITION p2;3:为分区表添加一个分区ALTER TABLE members ADD PARTITION (PARTITION p3 VALUES LESS THAN (2000);ALTER

39、 TABLE tt ADD PARTITION (PARTITION p2 VALUES IN (7, 14, 21);ALTER TABLE employees ADD PARTITION (PARTITION p5 VALUES LESS THAN (2010),PARTITION p6 VALUES LESS THAN MAXVALUE);4:将分区表的第一个分区分为两个新的分区ALTER TABLE membersREORGANIZE PARTITION p0 INTO (PARTITION n0 VALUES LESS THAN (1960),PARTITION n1 VALUES

40、LESS THAN (1970);5:也可以将两个分区合并为一个分区,也可以理解为重新组织分区ALTER TABLE members REORGANIZE PARTITION s0,s1 INTO (PARTITION p0 VALUES LESS THAN (1970);ALTER TABLE tbl_nameREORGANIZE PARTITION partition_listINTO (partition_definitions);ALTER TABLE members REORGANIZE PARTITION p0,p1,p2,p3 INTO (PARTITION m0 VALUES

41、LESS THAN (1980),PARTITION m1 VALUES LESS THAN (2000);ALTER TABLE tt ADD PARTITION (PARTITION np VALUES IN (4, 8);ALTER TABLE tt REORGANIZE PARTITION p1,np INTO (PARTITION p1 VALUES IN (6, 18),PARTITION np VALUES in (4, 8, 12);删除分区表:alter table tb_user remove partitioning;HASH,KEY 分区管理1:创建一个hash分区表C

42、REATE TABLE clients (id INT,fname VARCHAR(30),lname VARCHAR(30),signed DATE)PARTITION BY HASH( MONTH(signed) )PARTITIONS 12;将分区表从12个分区变为8个分区ALTER TABLE clients COALESCE PARTITION 4;同样的有以下的语句关于KEY分区的表:mysql CREATE TABLE clients_lk (- id INT,- fname VARCHAR(30),- lname VARCHAR(30),- signed DATE- )- PA

43、RTITION BY LINEAR KEY(signed)- PARTITIONS 12;Query OK, 0 rows affected (0.03 sec)mysql ALTER TABLE clients_lk COALESCE PARTITION 4;Query OK, 0 rows affected (0.06 sec)Records: 0 Duplicates: 0 Warnings: 0当然还有有限制的mysql ALTER TABLE clients COALESCE PARTITION 18;ERROR 1478 (HY000): Cannot remove all par

44、titions, use DROP TABLE instead要是分区数比现有的分区数多的话,只能使用 ADD来添加分区数.下面就表示增加了6个分区数ALTER TABLE clients ADD PARTITION PARTITIONS 6;交换分区,子分区的管理交换分区,ALTER TABLE pt EXCHANGE PARTITION p WITH TABLE ntwhere pt is the partitioned table and p is the partition or subpartition of pt to be exchanged with unpartitioned

45、 table nt, provided that the following statements are true:要满足以下的条件:1、PT是已经分区表,nt不是临时表2、两张表的表结构必须是一模一样的3、nt不能有外键约束,也不能有关于其他表的外键约束.4、nt表中的数据没有分区P以外的数据.WITHOUT VALIDATION指定的时候这条就可以忽视掉另外很重要的一点就是想要拥有EXCHANGE的权限的话必须对全表有DROP的权限才可以执行.alter table .EXCHANGE partition 将不会调用任何的触发器,执行完以后被EXCHANGE 的表的自增列就会重新赋初始值

46、.例如:ALTER TABLE ptEXCHANGE PARTITION pWITH TABLE nt with VALIDATION ;1:将分区和一个没有分区的表EXCHANGE创建表插入语句:CREATE TABLE e (id INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30)PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (50),PARTITION p1 VALUES LESS THAN (100),PARTITION p2 VALUES LESS THAN (150),PA

47、RTITION p3 VALUES LESS THAN (MAXVALUE);INSERT INTO e VALUES(1669, Jim, Smith),(337, Mary, Jones),(16, Frank, White),(2005, Linda, Black);查看分区和分区的行数SELECT PARTITION_NAME, TABLE_ROWSFROM INFORMATION_SCHEMA.PARTITIONSWHERE TABLE_NAME = e;SELECT TABLE_NAME, PARTITION_NAME, TABLE_ROWS, AVG_ROW_LENGTH, DA

48、TA_LENGTH FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = p AND TABLE_NAME LIKE e;创建新表:CREATE TABLE e2 LIKE e;然后交换分区开始了:ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2;这个语句是很奇怪的,如果e2里面没有数据的话就是切出分区,如果e2里面有数据的话就是相互交换但是如果e2里面的数据不能够满足分区p0的要求的话,切分区就会失败.1737 - Found a row that does not match the

49、 partition只有再指定不验证的时候才不会报错ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2 WITHOUT VALIDATION;WITHOUT VALIDATION 指定的时候效率会更高,因为不再做逐行验证了.子分区和没分区的表进行切换1:假设创建一个分区表,带有子分区然后就可以切分区了,先查看一下分区,SELECT PARTITION_NAME, SUBPARTITION_NAME, TABLE_ROWSFROM INFORMATION_SCHEMA.PARTITIONSWHERE TABLE_NAME = es;然后切出分区:A

50、LTER TABLE es EXCHANGE PARTITION p3sp0 WITH TABLE es2;当前执行切出分区前,必须要对新表做以下的处理:ALTER TABLE es2 REMOVE PARTITIONING;修改表的默认引擎:ALTER TABLE es3 ENGINE = MyISAM;维护表分区1:重建分区ALTER TABLE t1 REBUILD PARTITION p0, p1;2:重新组织分区ALTER TABLE t1 OPTIMIZE PARTITION p0, p1;3:分析某个分区,主要看行数和名称以及状态ALTER TABLE t1 ANALYZE PARTITION p3;4:修复分区,有重复值的时候就会报错.ALTER TABLE t1 REPAIR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论