在表和分区间交换数据

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. Enum

    1.定义时使用enum关键字定义. 2.隐式继承了java.lang.Enum类,所以不能再继承其他类了. 3.隐式的final修饰符,所以不能被其他类继承. package enumTest; pu ...

  2. 模拟jquery的$()选择器的实现

    <html> <head> </head> <body> <div id="div1">div1</div> ...

  3. The Path Attribute

    https://tools.ietf.org/html/rfc6265#section-5.1.1 4.1.2.4. The Path Attribute The scope of each cook ...

  4. A Taxonomy of Computer Organizations

    COMPUTER OR GANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION

  5. 自动化小应用系列----利用selenium启动多个独立的浏览器

    在我们测试的时候对于同一个系统,我们往往需要登陆多个不同的账号,由于cookie的原因,我们只能退出一个账号在登陆另外一颗账号,非常麻烦.我们可以使用selenium来启动浏览器,这样每个浏览器的属性 ...

  6. java文件来演示如何访问MySQL数据库

    java文件来演示如何访问MySQL数据库. 注:在命令行或用一个SQL的前端软件创建Database. 先创建数据库: CREATE DATABASE SCUTCS; 接着,创建表: CREATE ...

  7. 谈一谈php://filter的妙用

    php://filter是PHP中独有的协议,利用这个协议可以创造很多"妙用",本文说几个有意思的点,剩下的大家自己下去体会.本来本文的思路我上半年就准备拿来做XDCTF2016的 ...

  8. Java中的夏令时问题

    因为在用C#做项目的时候被夏令时坑过一回,所以这次将在java中的时区转换信息做一下记录,很简单 SimpleDateFormat inputFormat = new SimpleDateFormat ...

  9. ASP.NET MVC 表单submit()

    HTML代码 <form id="frmLogin"> <div class="form-group has-feedback"> &l ...

  10. 错误 You are trying to run the Python 2 version of Beautiful Soup under Python 3. This will not work

    Win  10    下python3.6 使用Beautiful Soup  4错误 You are trying to run the Python 2 version of Beautiful ...