直白的说就是迁移数据。迁移数据的方式很多,为什么要使用exchange partition的方式呢,表急,听三思慢慢道来。
				
				
						
						
						
				
		
		
				Exchange partition提供了一种方式,让你在表与表或分区与分区之间迁移数据,注意不是将表转换成分区或非分区的形式,而仅只是迁移表中数据(互相迁移),由于其号称是采用了更改数据字典的方式,因此效率最高(几乎不涉及io操作)。Exchange partition适用于所有分区格式,你可以将数据从分区表迁移到非分区表,也可以从非分区表迁移至分区表,或者从hash partition到range partition诸如此类吧。
				
						
						
				
		
		
				
						其语法很简单:alter table tbname1 exchange partition/subpartition ptname with table tbname2;
				
				
						
						
				
		
		
				Exchange partition迁移的方式也很有意思,言语表达怕大家听不明白,下面直接通过示例来表达:
				
						
						
				
		
		
				
						
						
				
		
		
				
						借用前文中创建的空分区表:t_partition_range,并插入几条记录
				
				
						
						
				
		
		
				JSSWEB> create table t_partition_range (id number,name varchar2(50))
				
						
						
				
		
		
				  2   partition by range(id)(
				
						
						
				
		
		
				  3   partition t_range_p1 values less than (10) tablespace tbspart01,
				
						
						
				
		
		
				  4   partition t_range_p2 values less than (20) tablespace tbspart02,
				
						
						
				
		
		
				  5   partition t_range_p3 values less than (30) tablespace tbspart03,
				
						
						
				
		
		
				  6   partition t_range_pmax values less than (maxvalue) tablespace tbspart04
				
						
						
				
		
		
				  7   );
				
						
						
				
		
		
				
						
						
				
		
		
				
						表已创建。
				
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> insert into t_partition_range values (11,'a');
				
						
						
				
		
		
				
						
						
				
		
		
				
						已创建 1 行。
				
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> insert into t_partition_range values (12,'b');
				
						
						
				
		
		
				
						
						
				
		
		
				
						已创建 1 行。
				
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> insert into t_partition_range values (13,'c');
				
						
						
				
		
		
				
						
						
				
		
		
				
						已创建 1 行。
				
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> commit;
				
						
						
				
		
		
				
						
						
				
		
		
				
						提交完成。
				
				
						
						
				
		
		
				
						
						
				
		
		
				
						再创建一个非分区表,结构与t_partition_range相同
				
				
						
						
				
		
		
				JSSWEB> create table t_partition_range_tmp (id number,name varchar2(50));
				
						
						
				
		
		
				
						
						
				
		
		
				
						表已创建。
				
				
						
						
				
		
		
				
						
						
				
		
		
				
						执行交换分区(我们知道刚插入到range分区表的数据都在分区t_range_p2中,因此这里指定交换该分区)
				
				
						
						
				
		
		
				JSSWEB> alter table t_partition_range exchange partition t_range_p2
				
						
						
				
		
		
				  2  with table t_partition_range_tmp;
				
						
						
				
		
		
				
						
						
				
		
		
				
						表已更改。
				
				
						
						
				
		
		
				
						
						
				
		
		
				
						看看效果如何:
				
				
						
						
				
		
		
				JSSWEB> select * from t_partition_range partition(t_range_p2);
				
						
						
				
		
		
				
						
						
				
		
		
				
						未选定行
				
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> select * from t_partition_range_tmp;
				
						
						
				
		
		
				
						
						
				
		
		
				        ID NAME
				
						
						
				
		
		
				---------- --------------------------------------------------
				
						
						
				
		
		
				        11 a
				
						
						
				
		
		
				        12 b
				
						
						
				
		
		
				        13 c
				
						
						
				
		
		
				
						记录成功交换到未分区的表中。
				
				
						
						
				
		
		
				
						
						
				
		
		
				
						我们再执行一次exchange partition的命令,看看又会发生什么呢
				
				
						
						
				
		
		
				JSSWEB> select *from t_partition_range partition(t_range_p2);
				
						
						
				
		
		
				
						
						
				
		
		
				        ID NAME
				
						
						
				
		
		
				---------- --------------------------------------------------
				
						
						
				
		
		
				        11 a
				
						
						
				
		
		
				        12 b
				
						
						
				
		
		
				        13 c
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> select *from t_partition_range_tmp;
				
						
						
				
		
		
				
						
						
				
		
		
				
						未选定行
				
				
						
						
				
		
		
				
						又交换回来了,有点儿意思。
				
				
						
						
				
		
		
				
						
						
				
		
		
				
						再做个更加明确的测试,我们往未分区的表中加入一些记录后再执行exchange partition,看看会发生什么呢:
				
				
						
						
				
		
		
				JSSWEB> insert into t_partition_range_tmp values (15,'d');
				
						
						
				
		
		
				
						
						
				
		
		
				
						已创建 1 行。
				
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> insert into t_partition_range_tmp values (16,'e');
				
						
						
				
		
		
				
						
						
				
		
		
				
						已创建 1 行。
				
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> insert into t_partition_range_tmp values (1
				7
				,'d');
				
						
						
				
		
		
				
						
						
				
		
		
				
						已创建 1 行。
				
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> alter table t_partition_range exchange partition t_range_p2
				
						
						
				
		
		
				  2  with table t_partition_range_tmp;
				
						
						
				
		
		
				
						
						
				
		
		
				
						表已更改。
				
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> select *from t_partition_range partition(t_range_p2);
				
						
						
				
		
		
				
						
						
				
		
		
				        ID NAME
				
						
						
				
		
		
				---------- --------------------------------------------------
				
						
						
				
		
		
				        15 d
				
						
						
				
		
		
				        16 e
				
						
						
				
		
		
				        17 d
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> select *from t_partition_range_tmp;
				
						
						
				
		
		
				
						
						
				
		
		
				        ID NAME
				
						
						
				
		
		
				---------- --------------------------------------------------
				
						
						
				
		
		
				        11 a
				
						
						
				
		
		
				        12 b
				
						
						
				
		
		
				        13 c
				
						
						
				
		
		
				
						这就是前面所说的,互相交换的意思~~
				
				
						
						
				
		
		
				
						
						
				
		
		
				
						注意:
				
				
						
						
				
		
		
				l 
				
						涉及交换的两表之间表结构必须一致,除非附加with validation子句;
				
				
						
						
				
		
		
				l 
				
						如果是从非分区表向分区表做交换,非分区表中的数据必须符合分区表中指定分区的规则,除非附加without validation子句;
				
				
						
						
				
		
		
				l 
				
						如果从分区表向分区表做交换,被交换的分区的数据必须符合分区规则,除非附加without validation子句;
				
				
						
						
				
		
		
				l 
				Global索引或涉及到数据改动了的global索引分区会被置为unusable,除非附加update indexes子句。
				
						
						
				
		
		
				
						提示:
				
				
						
						
				
		
		
				
						一旦附加了without validation子句,则表示不再验证数据有效性,因此指定该子句时务必慎重。
				
				
						
						
				
		
		
				
						例如:
				
				
						
						
				
		
		
				JSSWEB> insert into t_partition_range_tmp values (8,'g');
				
						
						
				
		
		
				
						
						
				
		
		
				
						已创建 1 行。
				
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> alter table t_partition_range exchange partition t_range_p2
				
						
						
				
		
		
				  2  with table t_partition_range_tmp without validation;
				
						
						
				
		
		
				
						
						
				
		
		
				
						表已更改。
				
				
						
						
				
		
		
				
						
						
				
		
		
				JSSWEB> select *from t_partition_range partition(t_range_p2);
				
						
						
				
		
		
				
						
						
				
		
		
				        ID NAME
				
						
						
				
		
		
				---------- --------------------------------------------------
				
						
						
				
		
		
				        11 a
				
						
						
				
		
		
				        12 b
				
						
						
				
		
		
				        13 c
				
						
						
				
		
		
				         8 g
				
						
						
				
		
		
				
						虽然新插入的记录并不符合t_range_p2分区的范围值,但指定了without validation后,数据仍然转换成功。
				
		
		
		
		
				
						
								
										=====================================
								
						
						
								
										查看前面的连载:
								
						
						
								
										
												(9)--删除表分区
										
								
						
						
								
										
												(8)--增加和收缩表分区
										
								
						
						
								
										
												
														
																(7)--怎样管理
														
												
										
								
						
						
								
										
												
														(6)--创建range-list组合分区
												
										
								
						
						
								
										
												
														(5)--创建range-hash组合分区(1)
												
										
								
						
						
								
										
												
														(4)--创建list分区
												
										
								
						
						
								
										
												
														(3)--创建hash分区
												
										
								
						
						
								
										
												
														(2)--创建range分区
												
										
								
						
						
								
										
												
														(1)--前言