mysql分区交换exchange partition

在表和分区间交换数据

mysql5.6开始支持alter table..exchange partition语法,该语句允许分区或子分区中的数据与另一个非分区的表中的数据进行交换,如果非分区表中的数据为空,那么相当于将分区中的数据移动到非分区表中,若分区表中的数据为空,则相当于将外部表中的数据导入到分区中,即,哪边不为空,哪边就是被移出的,哪边为空,哪边就是装数据的。

 

要使用alter table…exchange partition语句,必须满足下面的条件:

A:要交换的表需要和分区表有着完全相同的表结构,但是要交换的表不能含有分区

B:在非分区表中的数据必须在交换的分区定义内(即要对上分区列的定义范围)

C:被交换的表中不能含有外键,或者其他的表含有对该表的外键引用

D:用户除了需要alter,insert,create权限外,还需要drop权限,此外,还有两个小的细节需要注意:

a:使用该语句时,不会触发交换表和被交换表上的触发器

b:auto_increment列将被重置

示例:

创建分区表:

mysql> 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),

-> partition p3 values less than maxvalue);

Query OK, 0 rows affected (1.20 sec)

插入数据:

mysql> insert into e values(1669,‘jim‘,‘smith‘),(337,‘mary‘,‘jones‘),(16,‘frank‘,‘withe‘),(2005,‘linda‘,‘black‘);

Query OK, 4 rows affected (0.03 sec)

Records: 4  Duplicates: 0  Warnings: 0

创建非分区表:

mysql> create table e2 like e;

Query OK, 0 rows affected (0.15 sec)

mysql> alter table e2 remove partitioning;

Query OK, 0 rows affected (0.30 sec)

Records: 0  Duplicates: 0  Warnings: 0

使用下面的语句观察分区表中的数据:

mysql> select partition_name,table_rows from information_schema.partitions where table_name=‘e‘;

+----------------+------------+

| partition_name | table_rows |

+----------------+------------+

| p0             |          1 |

| p1             |          0 |

| p2             |          0 |

| p3             |          3 |

+----------------+------------+

4 rows in set (0.16 sec)

使用下面的语句把表e的分区p0中的数据移动到e2表中:

mysql> alter table e exchange partition p0 with table e2;

Query OK, 0 rows affected (0.01 sec)

再次查看p0分区的数据行数:

mysql> select partition_name,table_rows from information_schema.partitions where table_name=‘e‘;

+----------------+------------+

| partition_name | table_rows |

+----------------+------------+

| p0             |          0 |

| p1             |          0 |

| p2             |          0 |

| p3             |          3 |

+----------------+------------+

发现p0分区的数据行数为0了,这时查看e2表中的数据:

mysql> select * from e2;

+----+-------+-------+

| id | fname | lname |

+----+-------+-------+

| 16 | frank | withe |

+----+-------+-------+

1 row in set (0.00 sec)

发现p0分区中的数据被转移到了e2表中,再次执行交换语句:

mysql> alter table e exchange partition p0 with table e2;

Query OK, 0 rows affected (0.01 sec)

mysql> select * from e2;

Empty set (0.00 sec)

mysql> select * from e;

+------+-------+-------+

| id   | fname | lname |

+------+-------+-------+

|   16 | frank | withe |

| 1669 | jim   | smith |

|  337 | mary  | jones |

| 2005 | linda | black |

+------+-------+-------+

4 rows in set (0.00 sec)

发现表e2数据又被转移到了分区表e的p0分区中,注意,再把数据转回去的时候,可能select partition_name,table_rows from information_schema.partitions where table_name=‘e‘;这句无法实时查出在分区中行数的变化。

注:本帖参考《innodb技术内幕 innodb存储引擎第二版》

时间: 2024-10-06 00:44:07

mysql分区交换exchange partition的相关文章

深入解析MySQL分区(Partition)功能

自5.1开始对分区(Partition)有支持 = 水平分区(根据列属性按行分)= 举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录. === 水平分区的几种模式:=== * Range(范围) – 这种模式允许DBA将数据划分不同范围.例如DBA可以将一个表通过年份划分成三个分区,80年代(1980's)的数据,90年代(1990's)的数据以及任何在2000年(包括2000年)后的数据. * Hash(哈希) – 这中模式允许DBA通过对表的一

MySQL分区(Partition)功能

引用地址:http://blog.csdn.net/tjcyjd/article/details/11194489 自5.1开始对分区(Partition)有支持 = 水平分区(根据列属性按行分)=举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录. === 水平分区的几种模式:===* Range(范围) – 这种模式允许DBA将数据划分不同范围.例如DBA可以将一个表通过年份划分成三个分区,80年代(1980's)的数据,90年代(1990's)

MySQL分区管理

以下是我看MySQL官方文档的时候整理的笔记,仅作参考保留. 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 T

mysql分区研究

表分区学习 1. 概述 1.1. 优点: l 将表分区比一个表在单个磁盘或者文件系统存储能够存储更多数据 l 可以通过drop分区删除无用数据,也可以通过增加分区添加数据 l 查询可以通过分区裁剪进行优化,设置可以显示指定查找分区 l 对于聚合函数的全表查询,可以并行对分区查询,汇总得到结果 l 可以对分区指定不同存储磁盘实现更高的查询吞吐量 1.2. 分区类型: l 范围分区 l 列表分区 l 哈希分区 l 键值分区 1.3. 时间范围分区应用 同时支持将date,datetime字段作为范围

Mysql 分区介绍(九) —— 分区管理

一.分区操作 1. 将没有分区的表改为分区表 ALTER TABLE trb3 PARTITION BY KEY(id) PARTITIONS 2; 2. 删除分区 # 删除所有分区, 同时数据丢失 ALTER TABLE es2 REMOVE PARTITIONING; # 删除指定分区, 数据丢失 ALTER TABLE tr DROP PARTITION p2; 3. SELECT指定分区查询 select * from daily_rank_1_1 partition (p2015_04

Oracle分区交换

从Oracle8开始,提供了从分区交换的功能,如一个分区或子分区与一个非分区表交换.一个hash分区与另一个表的hash子分区交换等等,详细的交换方式可以参考官方文档. 基本语法:ALTER TABLE...EXCHANGE PARTITION 实验环境:11.2.0.4 [email protected]>select * from v$version; BANNER ---------------------------------------------------------------

用分区表分区交换做历史数据迁移

一.说明: OLTP库中有些表数据量大,且每月有持续的大量数据增加,由于历史数据在此库中不再做访问,而是在另1个OLAP库中做分析,所以会对历史数据迁移至OLAP库中.对这种历史数据迁移的操作,较好的办法是该表采用分区表.按时间分区后,可以对分区进行迁移.通过分区交换和表空间传输会很容易完成,而且性能上影响很小. 关于分区表更多内容:    http://blog.csdn.net/tanqingru/article/category/1397435 关于表空间传更多内容: http://blo

oracle exchange partition 測试

Exchange partition提供了一种方式,让你在表与表或分区与分区之间迁移数据.注意不是将表转换成分区或非分区的形式,而仅仅仅是迁移表中数 据(互相迁移),因为其号称是採用了更改数据字典的方式,因此效率最高( 差点儿不涉及io操作). Exchange partition适用于全部分区格式,你能够将数据从分区表迁移到非分区表.也能够从非分区表迁移至分区表. 这就给批量更新分区表的数据提供了一个非常不错的思路,这里我便做一次普通表与分区表数据交换的实验. 注意:分区表不能直接与分区表交换

oracle 入门笔记---分区表的分区交换

本文参考来自作者:蓝紫 详细内容请阅读原文 : http://www.cnblogs.com/lanzi/archive/2013/01/24/2875838.html 在oracle 11.2环境下测试 --drop table tab_a purge; --创建分区表 create table tab_a ( r_id number(19) primary key, r_name varchar2(300), r_pat  integer ) partition by list (r_pat