精华内容
下载资源
问答
  • 交换分区

    2019-09-06 21:34:53
    交换分区,可以理解成为虚拟内存。 1.使用fdisk /dev/sda 划分一个大小为2G的分区 /dev/sda4 2.把划分好的分区/dev/sda4格式化为交换文件系统 mkswap /dev/sda4 3.交换分区的操作 swapon /dev/sda4 启用交换分区 ...

    交换分区,可以理解成为虚拟内存。

    1.使用fdisk /dev/sda 划分一个大小为2G的分区 /dev/sda4

    2.把划分好的分区/dev/sda4格式化为交换文件系统
    mkswap /dev/sda4

    3.交换分区的操作
    swapon /dev/sda4 启用交换分区
    swapon -s 查看交换分区空间
    swapoff /dev/sda4 停用交换分区

    4.设置开机启用
    vim /etc/fstab
    /dev/sda4(设备) swap(挂载点) swap(文件系统类型) defaults(参数) 0(备份标记) 0(检测顺序)

    mount -a 挂载/etc/fstab中除了swap之外的所有分区
    swapon -a 挂载/etc/fstab中所有swap分区

    展开全文
  • MySQL交换分区的实例详解前言在介绍交换分区之前,我们先了解一下 mysql 分区。数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行...

    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 的交换分区的功能,有两种适用场景:

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

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

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

    展开全文
  • 原标题:MySQL 交换分区的实践在介绍交换分区之前,我们先了解一下 mysql 分区。数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行...

    原标题: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 的交换分区的功能,有两种适用场景:

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

    分区表的某个分区 和 一个非空普通表 交换,使得 普通表的数据搬移到分区表的指定分区中。返回搜狐,查看更多

    责任编辑:

    展开全文
  • 一、实现交换分区的基本语法:ALTER TABLEptEXCHANGE PARTITIONpWITH TABLEnt二、实现分区交换需满足以下前提条件:1. 表nt不能为分区表,也不能是临时表2.表nt的表结构必须于分区表pt一致3.表nt不包含外键引用,...

    从MySQL 5.6开始,支持分区交换。就是将一个分区表中的一个分区和一个普通表中的数据互换。一、实现交换分区的基本语法:ALTER TABLEptEXCHANGE PARTITIONpWITH TABLEnt二、实现分区交换需满足以下前提条件:1. 表nt不能为分区表,也不能是临时表2. 表nt的表结构必须于分区表pt一致3. 表nt不包含外键引用,其他表也没有任何外键引用表nt4. 表nt中所有行都必须在p分区范围内,否则交换分区失败。MySQL 5.7.5开始,可使用WITHOUT VALIDATION选项,强制交换。5. 对于InnoDB表,pt和nt两个表必须使用相同的行格式。三、使用交换分区的注意事项:1. 使用该语句时,不会触发交换表和被交换表上的触发器2. auto_increment列将被重置3. IGNORE关键字在alter table ... exchange partition中不起作用四、案例模拟:根据官网提供的案例,在自己的机器上简单的实现下:1. 新建分区表e,并插入4行记录

    d6fd77583e3ab978ce618dcf7b706450.png2. 创建与表e结构一致的表e2,并移除分区。

    c910db13ace61263d9f75ef15f25e52d.png

    976fcf9d54f26f6be7e86913a9595763.pngremove partitioning这个语法真的第一次见,神奇。。简单测了一下,不管表中有没有数据都是可以remove的。

    0570328579088ff418fe39ca0438c329.png3. 查看表e的分区中各有多少行

    4d652586d358a0698e14c8649e41e90b.png4.将表e的分区p0 交换到表e2中

    5f8d299283b8841f29407157a5863e07.png5.再观察下表e和表2的数据

    fcf30cd0a3f42886e3881b00e31e0bd0.png数据交换成功~当然,要与分区表交换的普通表,不一定必须是空的。继续实验,在表e的p0分区插入一行数据

    1094c2f044d0e1571fc450617381882d.png将表e的分区p0 交换到表e2中,然后检查数据

    a74f30512f01055839589ed71ca04650.png

    c1d7f3e1adfbbe146a836dce8f254c38.png数据也交换成功~如果表e2中的数据不在表e的p0分区范围内,那还能交换吗?

    687155e7cc4354c5ba7f1bceb9478dbb.png前面使用交换分区必须满足的前提条件中的第4点,其实已经讲到了这个问题。可以通过使用WITHOUT VALIDATION选项,不需要逐行验证,能够强制交换。当表e2中有很多数据需要交换时,加上这个参数可以避免耗时的验证,节省大量时间。

    7996d1e93f352f00d2095553171013d7.png现在 (51, "Ellen", "McDonald") 这行记录落在p0分区了。

    6d7a3cba60e1b16172309e75f3133f63.png可以通过REPAIR TABLE or ALTER TABLE ... REPAIR PARTITION来修复分区。

    9d57d274d37e1edce7d5c8e8cad18ae0.png

    90b63161cbf7f55d13238a412d19a5f9.png以上就是简单的交换分区的方法,MySQL还提供了自分区的交换功能,我就不再细说了,有需要可以去官方文档上看下语法。总结:1.  可以将分区表的某个分区和一个空表进行分区交换,已达到将指定分区的数据迁移出去的目的。MySQL中应该没有单独对分区备份的功能,通过交换分区的方法,能达到快速清理分区及备份的效果。2. 可以将分区表的某个分区和一个非空表进行数据交换,可以把数据快速迁移到指定分区中。每天学习一点点点点,大家周末愉快~

    2b49cde00c2ca01bc02e6d88bf1af9f0.png

    展开全文
  • 前言在介绍交换分区之前,我们先了解一下 mysql 分区。数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行分区。比如:按照时间分区...
  • MySQL交换分区的实例详解前言在介绍交换分区之前,我们先了解一下 mysql 分区。数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行...
  • MySQL交换分区的实例详解前言在介绍交换分区之前,我们先了解一下 mysql 分区。数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行...
  • 前言在介绍交换分区之前,我们先了解一下 mysql 分区。数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行分区。比如:按照时间分区...
  • 交换分区swap

    2014-12-04 21:32:17
    交换分区swap
  • 制作交换分区什么意思How to make a swap partition on Linux? 如何在Linux上创建交换分区? First, make a new partition (or reuse an existing one if you like). 首先,创建一个新分区(或根据需要重复使用现有...
  • 交换分区介绍 Linux系统中的交换分区是当物理内存(RAM)被充满时,作为物理内存的缓存来使用。 当系统需要更多的内存资源而物理内存已经充满,内存中不活跃的页就会被移动到交换分区上。 交换分区位于硬盘上,所以它...
  • 一:Mysql交换分区将 分区表pt 的 分区p和 一个普通表nt中的数据 进行互换。1、交换的前提条件:》普通表nt 不为临时表,且不是分区表。》表结构和分区表pt的结构一致。》普通表nt 没有外键引用。》普用表nt 若为...
  • 创建交换分区

    2021-04-16 11:05:59
    1.创建要作为swap分区的文件:增加1GB大小的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小)。 dd if=/dev/zero of=/root/swapfile bs=1M count=1024 2.格式化为交换分区文件: mkswap /...
  • MySQL交换分区的实例详解 前言 在介绍交换分区之前,我们先了解一下 mysql 分区。 数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表...
  • 前言在介绍交换分区之前,我们先了解一下 mysql 分区。数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行分区。比如:按照时间分区...
  • swap交换分区

    2019-08-19 15:25:49
    swap交换分区 swap交换分区就是把磁盘中一块当作内存使用用以解决真实物理内存不够的问题。 添加交换分区 创建分区 创建swap交换分区(也可以理解为格式化) [root@freedom /]# mkswap /dev/sdb2 正在设置交换...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,297
精华内容 2,518
关键字:

交换分区