在表和分区间交换数据

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. 去除DataTable中的重复数据

    有时需要从DataTable中抽取Distinct数据,遍历比较费劲,C#.NET中其实有更易用的方法,如下: string[] columnArray = { "columnName1&q ...

  2. 张小龙在2017微信公开课PRO版讲了什么(附演讲实录和2016微信数据报告)

    今天2017微信公开课PRO版在广州亚运城综合体育馆举行,这次2017微信公开课大会以“下一站”为主题,而此次的微信公开课的看点大家可能就集中在腾讯公司高级副总裁.微信之父——张小龙的演讲上了!今天中 ...

  3. Thinkphp 1.验证规则 2.静态定义 3.动态验证

    一.验证规则 数据验证可以对表单中的字段进行非法的验证操作.一般提供了两种验证方式: 静态定 义($_validate 属性)和动态验证(validate()方法). //验证规则 array( ar ...

  4. session过期时间

    在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户没有使用系统一定时间后,自动退出登录,销毁session. 具体设置很简单: 在主页面或者公共页面中加入:session.set ...

  5. Java 静态变量,常量和方法

    static 关键字 例如:在球类中使用PI这个常量,可能除了本类需要这个常量之外,在另外一个圆类中也需要使用这个常量.这时没有必要 在两个类中同时创建PI这个常量,因为这样系统会将这两个不在同一个类 ...

  6. RHEL6.5 换源

    由于redhat的yum在线更新要收费,即没有注册的无法使用:将redhat的yum卸载.重装第三方源. 第三方源包括:网易,重庆大学,epel 等Author wood_man.2015.10.2 ...

  7. 如何设置jvm内存

    本文向大家简单介绍一下进行JVM内存设置几种方法,安装Java开发软件时,默认安装包含两个文件夹,一个JDK(Java开发工具箱),一个JRE(Java运行环境,内含JVM),其中JDK内另含一个JR ...

  8. itertools模块

    itertools模块中有很多函数,返回的是一个迭代器 参考: http://www.wklken.me/posts/2013/08/20/python-extra-itertools.html#_1

  9. css响应式布局RWD

    响应式布局结合了三大理念: 1)用于布局的弹性网络(百分比定义宽度) 2)用于图片和视频的弹性媒体 3)媒体查询 在布局中,需要注意的点有: 1)尽量用min-width/max-width,max- ...

  10. django项目的接口测试

    基于Python的Django框架: 进行接口测试: 参见虫师的博客: 整理部分笔记: