精华内容
下载资源
问答
  • 前言在介绍交换分区之前,我们先了解一下 mysql 分区。...在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。交换分区的实现1、交换分区的语法alter table pt exchange ...

    前言

    在介绍交换分区之前,我们先了解一下 mysql 分区。

    数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行分区。比如:按照时间分区,每一年一个分区等。

    在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。

    交换分区的实现

    1、交换分区的语法

    alter table pt exchange partition p with table nt;

    解释:

    将 分区表pt 的 分区p 和 一个普通表nt 中的数据 进行互换。

    交换的前提条件:

    普通表nt 不为临时表,且不是分区表。

    表结构和分区表pt的结构一致。

    普通表nt 没有外键引用。

    普用表nt 若为非空。在MySQL5.6以及之前的版本,必须在分区的范围内;在MySQL5.7之后则可以不再其分区范围内,也依然会成功存入该分区中。

    2、实验 交换分区

    (1) 创建一个分区表,并插入数据

    # 创建一个 分区表e

    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) ); # 向分区表e中插入几条数据 INSERT INTO e VALUES (1669, "Jim", "Smith"), (337, "Mary", "Jones"), (16, "Frank", "White"), (2005, "Linda", "Black");

    (2) 创建一个和分区表e结构一致的普通表e2

    # 创建一个表e2

    mysql> create table e2 like e;

    # 删除表e2的分区,使之成为一个普通表

    mysql> alter table e2 remove partitioning;

    (3) 查看表e的分区中各有多少行

    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 inset (0.00 sec)

    (4) 将表e的分区p0 交换到 普通表e2中

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

    (5) 查看结果

    # 表e中 分区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 | +----------------+------------+ 4 rows inset (0.00 sec) # 在表e2中有了 一条来自表e的分区p0 的数据 mysql> SELECT * FROM e2; +----+-------+-------+ | id | fname | lname | +----+-------+-------+ | 16 | Frank | White | +----+-------+-------+ 1 row inset (0.00 sec)

    由此发现,表e的分区p0的数据 搬移到了 表e2中。

    上面的例子,是将一个分区 和 一个普通的空表 交换,这样相当于将一个分区的数据搬移了出去,通常使用在数据的归档中。

    同样,交换分区也可以 在一个分区和一个非空普通表中 发生交换,这样普通表中的数据会搬迁到指定分区,该指定分区的数据会搬迁到普通表中。如下操作:

    (6) 再向分区表e的p0中添加一条数据

    # 在表e中添加一条在分区p0范围内的数据

    mysql> INSERT INTO e VALUES (41, "Michael", "Green"); Query OK, 1 row affected (0.05 sec) # 确认插入的数据确实以存放在分区p0 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 inset (0.00 sec)

    (7) 执行 交换分区

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

    Query OK, 0 rows affected (0.28 sec)

    (8) 查看结果

    # 之前把表e的p0交换到表e2的一条数据,现在又回到了表e

    mysql> SELECT * FROM e;

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

    | id | fname | lname |

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

    | 16 | Frank | White | | 1669 | Jim | Smith | | 337 | Mary | Jones | | 2005 | Linda | Black | +------+-------+-------+ 4 rows in set (0.00 sec) mysql> SELECT * FROM e2; +----+---------+-------+ | id | fname | lname | +----+---------+-------+ | 41 | Michael | Green | +----+---------+-------+ 1 row in set (0.00 sec)

    由此看出,表e的p0 和 表e2 的数据做了互换!这种场景,可以在普通表数据搬移到分区表的某个分区中使用。

    但是,有一点需要注意:

    若普通表的数据 不在 要交换的分区范围内,上面交换分区的语法,不可以执行成功!请看下面的操作。

    (9) 在普通表e2中插入一条超出表e的p0范围的数据,执行上面的交换语句

    mysql> INSERT INTO e2 VALUES (51, "Ellen", "McDonald");

    Query OK, 1 row affected (0.08 sec) mysql> alter table e exchange partition p0 with table e2; ERROR 1707 (HY000): Found row that does not match the partition

    在MySQL 5.6 版本中,该问题无法解决;而在MySQL 5.7.5版本中,增加了一个选项 WITHOUT VALIDATION ,可以解决上面的报错。操作如下:

    mysql> ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2 WITHOUT VALIDATION; Query OK, 0 rows affected (0.02 sec)

    查看结果:

    # id为51的数据也存放在表e的p0中

    mysql> select * from e partition(p0);

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

    | id | fname | lname | +------+---------+----------+ | 41 | Michael | Green | | 51 | Ellen | McDonald | +------+---------+----------+ mysql> SELECT * FROM e2; +----+---------+-------+ | id | fname | lname | +----+---------+-------+ | 16 | Frank | White | +----+---------+-------+ 1 row in set (0.00 sec)

    总结

    通过上述实践操作发现,MySQL 的交换分区的功能,有两种适用场景:

    分区表的某个分区 和 一个空的普通表 交换,使得 分区表的该分区的数据搬移出去。

    分区表的某个分区 和 一个非空普通表 交换,使得 普通表的数据搬移到分区表的指定分区中。

    展开全文
  • 前言在介绍交换分区之前,我们先了解一下 mysql 分区。...在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。交换分区的实现1、交换分区的语法altertableptexchangepart...

    前言

    在介绍交换分区之前,我们先了解一下 mysql 分区。

    数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行分区。比如:按照时间分区,每一年一个分区等。

    在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。

    交换分区的实现

    1、交换分区的语法

    altertableptexchangepartitionpwithtablent;

    解释:

    将 分区表pt 的 分区p 和 一个普通表nt 中的数据 进行互换。

    交换的前提条件:

    普通表nt 不为临时表,且不是分区表。

    表结构和分区表pt的结构一致。

    普通表nt 没有外键引用。

    普用表nt 若为非空。在MySQL5.6以及之前的版本,必须在分区的范围内;在MySQL5.7之后则可以不再其分区范围内,也依然会成功存入该分区中。

    2、实验 交换分区

    (1) 创建一个分区表,并插入数据

    # 创建一个 分区表eCREATETABLEe(    id INT NOT NULL,    fname VARCHAR(30),    lname VARCHAR(30))PARTITIONBYRANGE(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));# 向分区表e中插入几条数据INSERTINTOeVALUES(1669,"Jim","Smith"),    (337,"Mary","Jones"),    (16,"Frank","White"),    (2005,"Linda","Black");

    (2) 创建一个和分区表e结构一致的普通表e2

    # 创建一个表e2mysql> createtablee2 like e;# 删除表e2的分区,使之成为一个普通表mysql> altertablee2 remove partitioning;

    (3) 查看表e的分区中各有多少行

    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 rowsinset (0.00 sec)

    (4) 将表e的分区p0 交换到 普通表e2中

    mysql> altertablee exchange partition p0 withtablee2;

    (5) 查看结果

    # 表e中 分区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|

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

    4 rowsinset (0.00 sec)

    # 在表e2中有了 一条来自表e的分区p0 的数据

    mysql> SELECT * FROM e2;

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

    |id| fname |lname|

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

    |16| Frank |White|

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

    1 rowinset (0.00 sec)

    由此发现,表e的分区p0的数据 搬移到了 表e2中。

    上面的例子,是将一个分区 和 一个普通的空表 交换,这样相当于将一个分区的数据搬移了出去,通常使用在数据的归档中。

    同样,交换分区也可以 在一个分区和一个非空普通表中 发生交换,这样普通表中的数据会搬迁到指定分区,该指定分区的数据会搬迁到普通表中。如下操作:

    (6) 再向分区表e的p0中添加一条数据

    # 在表e中添加一条在分区p0范围内的数据mysql> INSERT INTO e VALUES (41,"Michael","Green");            Query OK,1row affected (0.05sec)# 确认插入的数据确实以存放在分区p0mysql> 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 rowsinset (0.00 sec)

    (7) 执行 交换分区

    ​mysql> altertablee exchange partition p0 withtablee2;Query OK,0rows affected (0.28sec)

    (8) 查看结果

    # 之前把表e的p0交换到表e2的一条数据,现在又回到了表emysql> SELECT * FROM e;+------+-------+-------+| id  |fname| lname |+------+-------+-------+|  16 |Frank| White || 1669 |Jim| Smith ||  337 |Mary| Jones || 2005 |Linda| Black |+------+-------+-------+4rowsinset (0.00sec)mysql> SELECT * FROM e2;+----+---------+-------+| id |fname| lname |+----+---------+-------+| 41 |Michael| Green |+----+---------+-------+1rowinset (0.00sec)

    由此看出,表e的p0 和 表e2 的数据做了互换!这种场景,可以在普通表数据搬移到分区表的某个分区中使用。

    但是,有一点需要注意:

    若普通表的数据 不在 要交换的分区范围内,上面交换分区的语法,不可以执行成功!请看下面的操作。

    (9) 在普通表e2中插入一条超出表e的p0范围的数据,执行上面的交换语句

    mysql> INSERT INTO e2 VALUES (51,"Ellen","McDonald");Query OK,1row affected (0.08sec)mysql> altertablee exchange partition p0 withtablee2;ERROR1707(HY000): Found row that doesnotmatch the partition

    在MySQL 5.6 版本中,该问题无法解决;而在MySQL 5.7.5版本中,增加了一个选项 WITHOUT VALIDATION ,可以解决上面的报错。操作如下:

    mysql>ALTERTABLEeEXCHANGEPARTITIONp0WITHTABLEe2WITHOUTVALIDATION;QueryOK, 0rowsaffected(0.02sec)

    查看结果:

    # id为51的数据也存放在表e的p0中mysql> select * from e partition(p0);+------+---------+----------+| id  |fname| lname    |+------+---------+----------+|  41 |Michael| Green    ||  51 |Ellen| McDonald |+------+---------+----------+mysql> SELECT * FROM e2;+----+---------+-------+| id |fname| lname |+----+---------+-------+| 16 |Frank| White |+----+---------+-------+1rowinset (0.00sec)

    总结

    通过上述实践操作发现,MySQL 的交换分区的功能,有两种适用场景:

    分区表的某个分区 和 一个空的普通表 交换,使得 分区表的该分区的数据搬移出去。

    分区表的某个分区 和 一个非空普通表 交换,使得 普通表的数据搬移到分区表的指定分区中。

    展开全文
  • 前言在介绍交换分区之前,我们先了解一下 mysql 分区。...在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。交换分区的实现1、交换分区的语法 alter table pt exchang...

    前言

    在介绍交换分区之前,我们先了解一下 mysql 分区。

    数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行分区。比如:按照时间分区,每一年一个分区等。

    在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。

    交换分区的实现

    1、交换分区的语法 alter table pt exchange partition p with table nt;

    解释: 将 分区表pt 的 分区p 和 一个普通表nt 中的数据 进行互换。

    交换的前提条件: 普通表nt 不为临时表,且不是分区表。

    表结构和分区表pt的结构一致。

    普通表nt 没有外键引用。

    普用表nt 若为非空。在MySQL5.6以及之前的版本,必须在分区的范围内;在MySQL5.7之后则可以不再其分区范围内,也依然会成功存入该分区中。

    2、实验 交换分区

    (1) 创建一个分区表,并插入数据 # 创建一个 分区表e 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) ); # 向分区表e中插入几条数据 INSERT INTO e VALUES (1669, "Jim", "Smith"), (337, "Mary", "Jones"), (16, "Frank", "White"), (2005, "Linda", "Black");

    (2) 创建一个和分区表e结构一致的普通表e2 # 创建一个表e2 mysql> create table e2 like e; # 删除表e2的分区,使之成为一个普通表 mysql> alter table e2 remove partitioning;

    (3) 查看表e的分区中各有多少行 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.00 sec)

    (4) 将表e的分区p0 交换到 普通表e2中 mysql> alter table e exchange partition p0 with table e2;

    (5) 查看结果 # 表e中 分区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 | +----------------+------------+ 4 rows in set (0.00 sec) # 在表e2中有了 一条来自表e的分区p0 的数据 mysql> SELECT * FROM e2; +----+-------+-------+ | id | fname | lname | +----+-------+-------+ | 16 | Frank | White | +----+-------+-------+ 1 row in set (0.00 sec)

    由此发现,表e的分区p0的数据 搬移到了 表e2中。

    上面的例子,是将一个分区 和 一个普通的空表 交换,这样相当于将一个分区的数据搬移了出去,通常使用在数据的归档中。

    同样,交换分区也可以 在一个分区和一个非空普通表中 发生交换,这样普通表中的数据会搬迁到指定分区,该指定分区的数据会搬迁到普通表中。如下操作:

    (6) 再向分区表e的p0中添加一条数据 # 在表e中添加一条在分区p0范围内的数据 mysql> INSERT INTO e VALUES (41, "Michael", "Green"); Query OK, 1 row affected (0.05 sec) # 确认插入的数据确实以存放在分区p0 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.00 sec)

    (7) 执行 交换分区 ​mysql> alter table e exchange partition p0 with table e2; Query OK, 0 rows affected (0.28 sec)

    (8) 查看结果 # 之前把表e的p0交换到表e2的一条数据,现在又回到了表e mysql> SELECT * FROM e; +------+-------+-------+ | id | fname | lname | +------+-------+-------+ | 16 | Frank | White | | 1669 | Jim | Smith | | 337 | Mary | Jones | | 2005 | Linda | Black | +------+-------+-------+ 4 rows in set (0.00 sec) mysql> SELECT * FROM e2; +----+---------+-------+ | id | fname | lname | +----+---------+-------+ | 41 | Michael | Green | +----+---------+-------+ 1 row in set (0.00 sec)

    由此看出,表e的p0 和 表e2 的数据做了互换!这种场景,可以在普通表数据搬移到分区表的某个分区中使用。

    但是,有一点需要注意:

    若普通表的数据 不在 要交换的分区范围内,上面交换分区的语法,不可以执行成功!请看下面的操作。

    (9) 在普通表e2中插入一条超出表e的p0范围的数据,执行上面的交换语句 mysql> INSERT INTO e2 VALUES (51, "Ellen", "McDonald"); Query OK, 1 row affected (0.08 sec) mysql> alter table e exchange partition p0 with table e2; ERROR 1707 (HY000): Found row that does not match the partition

    在MySQL 5.6 版本中,该问题无法解决;而在MySQL 5.7.5版本中,增加了一个选项 WITHOUT VALIDATION ,可以解决上面的报错。操作如下: mysql> ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2 WITHOUT VALIDATION; Query OK, 0 rows affected (0.02 sec)

    查看结果: # id为51的数据也存放在表e的p0中 mysql> select * from e partition(p0); +------+---------+----------+ | id | fname | lname | +------+---------+----------+ | 41 | Michael | Green | | 51 | Ellen | McDonald | +------+---------+----------+ mysql> SELECT * FROM e2; +----+---------+-------+ | id | fname | lname | +----+---------+-------+ | 16 | Frank | White | +----+---------+-------+ 1 row in set (0.00 sec)

    总结

    通过上述实践操作发现,MySQL 的交换分区的功能,有两种适用场景: 分区表的某个分区 和 一个空的普通表 交换,使得 分区表的该分区的数据搬移出去。

    分区表的某个分区 和 一个非空普通表 交换,使得 普通表的数据搬移到分区表的指定分区中。

    展开全文
  • MySQL交换分区的实例详解前言在介绍交换分区之前,我们先了解一下 mysql 分区...在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。交换分区的实现1、交换分区的语法alter tabl...

    MySQL交换分区的实例详解

    前言

    在介绍交换分区之前,我们先了解一下 mysql 分区。

    数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行分区。比如:按照时间分区,每一年一个分区等。

    在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。

    交换分区的实现

    1、交换分区的语法

    alter table pt exchange partition p with table nt;

    解释:

    将 分区表pt 的 分区p 和 一个普通表nt 中的数据 进行互换。

    交换的前提条件:

    普通表nt 不为临时表,且不是分区表。

    表结构和分区表pt的结构一致。

    普通表nt 没有外键引用。

    普用表nt 若为非空。在MySQL5.6以及之前的版本,必须在分区的范围内;在MySQL5.7之后则可以不再其分区范围内,也依然会成功存入该分区中。

    2、实验 交换分区

    (1) 创建一个分区表,并插入数据

    # 创建一个 分区表e

    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)

    );

    # 向分区表e中插入几条数据

    INSERT INTO e VALUES

    (1669, "Jim", "Smith"),

    (337, "Mary", "Jones"),

    (16, "Frank", "White"),

    (2005, "Linda", "Black");

    (2) 创建一个和分区表e结构一致的普通表e2

    # 创建一个表e2

    mysql> create table e2 like e;

    # 删除表e2的分区,使之成为一个普通表

    mysql> alter table e2 remove partitioning;

    (3) 查看表e的分区中各有多少行

    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.00 sec)

    (4) 将表e的分区p0 交换到 普通表e2中

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

    (5) 查看结果

    # 表e中 分区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 |

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

    4 rows in set (0.00 sec)

    # 在表e2中有了 一条来自表e的分区p0 的数据

    mysql> SELECT * FROM e2;

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

    | id | fname | lname |

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

    | 16 | Frank | White |

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

    1 row in set (0.00 sec)

    由此发现,表e的分区p0的数据 搬移到了 表e2中。

    上面的例子,是将一个分区 和 一个普通的空表 交换,这样相当于将一个分区的数据搬移了出去,通常使用在数据的归档中。

    同样,交换分区也可以 在一个分区和一个非空普通表中 发生交换,这样普通表中的数据会搬迁到指定分区,该指定分区的数据会搬迁到普通表中。如下操作:

    (6) 再向分区表e的p0中添加一条数据

    # 在表e中添加一条在分区p0范围内的数据

    mysql> INSERT INTO e VALUES (41, "Michael", "Green");

    Query OK, 1 row affected (0.05 sec)

    # 确认插入的数据确实以存放在分区p0

    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.00 sec)

    (7) 执行 交换分区

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

    Query OK, 0 rows affected (0.28 sec)

    (8) 查看结果

    # 之前把表e的p0交换到表e2的一条数据,现在又回到了表e

    mysql> SELECT * FROM e;

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

    | id | fname | lname |

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

    | 16 | Frank | White |

    | 1669 | Jim | Smith |

    | 337 | Mary | Jones |

    | 2005 | Linda | Black |

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

    4 rows in set (0.00 sec)

    mysql> SELECT * FROM e2;

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

    | id | fname | lname |

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

    | 41 | Michael | Green |

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

    1 row in set (0.00 sec)

    由此看出,表e的p0 和 表e2 的数据做了互换!这种场景,可以在普通表数据搬移到分区表的某个分区中使用。

    但是,有一点需要注意:

    若普通表的数据 不在 要交换的分区范围内,上面交换分区的语法,不可以执行成功!请看下面的操作。

    (9) 在普通表e2中插入一条超出表e的p0范围的数据,执行上面的交换语句

    mysql> INSERT INTO e2 VALUES (51, "Ellen", "McDonald");

    Query OK, 1 row affected (0.08 sec)

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

    ERROR 1707 (HY000): Found row that does not match the partition

    在MySQL 5.6 版本中,该问题无法解决;而在MySQL 5.7.5版本中,增加了一个选项 WITHOUT VALIDATION ,可以解决上面的报错。操作如下:

    mysql> ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2 WITHOUT VALIDATION;

    Query OK, 0 rows affected (0.02 sec)

    查看结果:

    # id为51的数据也存放在表e的p0中

    mysql> select * from e partition(p0);

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

    | id | fname | lname |

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

    | 41 | Michael | Green |

    | 51 | Ellen | McDonald |

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

    mysql> SELECT * FROM e2;

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

    | id | fname | lname |

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

    | 16 | Frank | White |

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

    1 row in set (0.00 sec)

    总结

    通过上述实践操作发现,MySQL 的交换分区的功能,有两种适用场景:

    分区表的某个分区 和 一个空的普通表 交换,使得 分区表的该分区的数据搬移出去。

    分区表的某个分区 和 一个非空普通表 交换,使得 普通表的数据搬移到分区表的指定分区中。

    感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

    展开全文
  • 一、实验说明: 操作系统:rhel 5.4 x86 数据库:Oracle 11g R2 实验说明:该实验参照了谭老师《让Oracle...二、在数据库中创建带加载数据的分区表及索引----------创建一个包含3个分区的分区表,分区字段是一个...
  • 前言在介绍交换分区之前,我们先了解一下 mysql 分区。...在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。交换分区的实现1、交换分区的语法alter table pt exchange ...
  • 本篇文章紧接着上一篇文章讲述,前一篇文章参阅:... MySQL数据库允许在RANGE和LIST的分区上再进行HASH或KEY分区 演示案例 创建下面一个,对b字段年份进行RANGE分区,然后再根据...
  • MySQL交换分区的实例详解前言在介绍交换分区之前,我们先了解一下 mysql 分区...在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。交换分区的实现1、交换分区的语法alter tabl...
  • 一、实验说明: 操作系统:rhel 5.4 x86 ...二、在数据库中创建带加载数据的分区表及索引 ----------创建一个包含3个分区的分区表,分区字段是一个时间字段,分别存放2011年、2012年和之后数据。----- ...
  • 在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。 交换分区的实现 1、交换分区的语法 alter table pt exchange partition p with table nt; 解释: 将 分区表pt 的 分区p 和 ...
  • 前言 ... 在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。 交换分区的实现 1、交换分区的语法 alter table pt exchange partition p with table ...
  • PostgreSQL 分区表教程

    2021-01-10 21:26:28
    分区可能是一个很好解决方案,因为它可以将一个大划分为更小的表,从而减少扫描和内存交换问题,从而提高数据库性能。 分区有助于扩展PostgreSQL,它将大型逻辑拆分为较小物理,这些物理可以根据使用...
  • 1. 案例背景 Product:生产交易数据库,存放当月交易...功能需求:在每个月末,将Product交易数据全部移植到DW。 2. 实施过程 --Product关键交易Sales定义如下: create table sales (invoice_no nu
  • oracle分区交换

    千次阅读 2014-04-15 17:50:26
    在Oracle数据库开发,对于这种大数据转移可以使用分区表交换技术实现。即使你一次转移数据量几亿甚至几十亿也没有关系,转移时间依然是毫秒级。这个方法大体流程是这样:首先,你需要将当前表修改为分区表,...
  • Oracle之分区交换技术

    2019-10-11 09:51:42
    在数据运维过程数据库的01空间容量不够,需要将数据迁移到01空间。 方法评估: 1.传统insert into delete 方式,简单但需要消耗大量计算资源和时间 2.分区交换技术 ,从指针级层级改动数据指向,速度...
  • 2011-07-01 15:45 by 听风吹雨, 6189 阅读, 30 评论, 收藏, 编辑前言前段时间在忙数据库表分区,经常会去上网找资料,但是在找到都是测试表分区的文章,没有实战经验的,所以在我把表分区运用到实际项目中的时候...
  • 特别说明:该案例引自谭老师...一、分别在两个数据库中创建一个分区表,并为每个分区创建一个单独表空间,以便于和临时表做分区交换。 1.1、在数据库YFT1: Create Tablespace 1 [oracle@node2 ~]$ env...
  • 在我看来分析数据库表是为了获取表的统计信息,...这种情况最好是在交换之后再进行分析,因为如果先分析临时表之后再交换,那么交换之后临时表中的分析信息只是作为分区表的分区信息交换进去,而分区表的全局...
  • 4.1.2 所有数据库文件中的I/O瓶颈 59 4.1.3 后台进程中的并发I/O操作 61 4.1.4 定义系统恢复能力与性能目标 61 4.1.5 系统硬件及结构镜像的定义 62 4.1.6 识别专用于数据库的磁盘 62 4.1.7 选择正确的设计 63 4.2 I/...
  • 3.8.6 Korn shell编程中的流控制结构 53 3.9 管理UNIX进程 55 3.9.1 用ps命令收集进程信息 55 3.9.2 在注销后运行进程 56 3.9.3 在后台执行进程 56 3.9.4 用kill命令终止进程 56 3.10 UNIX系统管理和...

空空如也

空空如也

1 2 3 4
收藏数 72
精华内容 28
关键字:

数据库分区表中的交换分区