在表和分区间交换数据

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存储引擎第二版》

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

  1. oracle分区交换技术

    交换分区的操作步骤如下: 1. 创建分区表t1,假设有2个分区,P1,P2.2. 创建基表t11存放P1规则的数据.3. 创建基表t12 存放P2规则的数据.4. 用基表t11和分区表T1的P1分区交 ...

  2. Oracle12c中分区(Partition)新特性之TRUNCATEPARTITION和EXCHANGE PARTITION级联功能

    TRUNCATE [SUB]PARTITION和EXCHANGE [SUB]PARTITION命令如今可以包括CASCADE子句,从而允许参照分区表向下级联这些操作.为确保该选项正常,相关外键也必须包 ...

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

    自5.1开始对分区(Partition)有支持 = 水平分区(根据列属性按行分)= 举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录. === 水平分区 ...

  4. MySQL分区(Partition)功能

    引用地址:http://blog.csdn.net/tjcyjd/article/details/11194489 自5.1开始对分区(Partition)有支持 = 水平分区(根据列属性按行分)=举 ...

  5. mysql分区研究

    表分区学习 1. 概述 1.1. 优点: l 将表分区比一个表在单个磁盘或者文件系统存储能够存储更多数据 l 可以通过drop分区删除无用数据,也可以通过增加分区添加数据 l 查询可以通过分区裁剪进行 ...

  6. MySQL分区管理

    以下是我看MySQL官方文档的时候整理的笔记,仅作参考保留. RANGE,LIST分区管理 1:为未分区表创建分区 ; 2:删除某个分区的数据 ALTER TABLE tr DROP PARTITIO ...

  7. 由mysql分区想到的分表分库的方案

    在分区分库分表前一定要了解分区分库分表的动机. 对实时性要求比较高的场景,使用数据库的分区分表分库. 对实时性要求不高的场景,可以考虑使用索引库(es/solr)或者大数据hadoop平台来解决(如数 ...

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

    一. 说明: OLTP库中有些表数据量大,且每月有持续的大量数据添加.因为历史数据在此库中不再做訪问,而是在另1个OLAP库中做分析.所以会对历史数据迁移至OLAP库中.对这样的历史数据迁移的操作.较 ...

  9. oracle exchange partition 測试

    Exchange partition提供了一种方式,让你在表与表或分区与分区之间迁移数据.注意不是将表转换成分区或非分区的形式,而仅仅仅是迁移表中数  据(互相迁移),因为其号称是採用了更改数据字典的 ...

随机推荐

  1. CSS中有关水平居中和垂直居中的解决办法

    CCS中让div等块级元素在父级元素中居中的方法: (1)div{  margin:0 auto   } 该方法只能实现水平的居中,无法实现元素的垂直居中 (2)当div元素的宽高是固定的,然后设置位 ...

  2. MVC 关于easyui-datebox 赋值问题

    view <script type="text/javascript"> $(function () { var date = '@ViewData["end ...

  3. JMeter学习-029-JMeter配置文件propertie配置项读取及应用实例

    在上文中提到通过读取配置文件中的数据,以此定制JMeter Slave的脚本分发路径(默认脚本路径,即参数文件相对路径父目录). 此文,就以此为例进行实例说明. 通过阅读JMeter源码 core/s ...

  4. angularjs中ng-controller中绑定对象

    <!DOCTYPE HTML><html ng-app="myApp"><head><meta http-equiv="Cont ...

  5. Issue 0:发刊词

    最近读吴军博士的文章,很受感悟.知识的成体系地积累过程对一个人的素养提高很有帮助,所以打算开通这本电子期刊,以一周一篇文章的形式汇总今后的知识体系. 宗旨:及时和团队讨论,反馈:善于利用工具.时间越长 ...

  6. [CC]获取ScalarField的值

    //根据字段滤波void MainWindow::doActionFilterByValue() ReferenceCloud* ManualSegmentationTools::segment(Ge ...

  7. js贪吃蛇源码

    1.注意,自己引入jquery,这个demo基于jquery的,我的jquery是写的本地的 2.没有写注释,看不懂的再问我吧, <!DOCTYPE html><html> & ...

  8. Linux系统安装

    http://soft.chinabyte.com/os/447/12439447.shtml     磁盘分区 http://www.huaweigold.com/doc/ServerDOC-201 ...

  9. [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  10. Java 线程的转换及状态

    线程的状态转换是线程控制的基础. 线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnabl ...