Mysql数据库表分区存储到指定磁盘路径

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 0. 前提:mysql5.6.6以上的版本以上的版本才支持单表指定目录,且目录权限是mysql:mysql。在mysql中数据文件存放于在my.cnf中datadir指定的路径,使用的表引擎不同产生的文件格式、表文件个数也会有所差异。mysql的表引擎有多种,表的扩展名也不一样,如innodb用“ .ibd”,archive用“.arc ”,csv用“.csv”等。

image.png

1.步骤详解

步骤一:设定my.cnf配置文件。

innodb_file_per_table=1


验证开关已经打开。


mysql> SHOW VARIABLES LIKE 'innodb_file_per_table';

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

| Variable_name | Value |

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

| innodb_file_per_table | ON |

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

1 row in set (0.00 sec)

1

2

3

4

5

6

7

步骤二:创建指定路径存储的分区表。

CREATE TABLE orders_list2 (

 id INT AUTO_INCREMENT,

 customer_surname VARCHAR(30),

 store_id INT,

 salesperson_id INT,

 order_date DATE,

 note VARCHAR(500),

 INDEX idx (id)

) ENGINE = INNODB

 PARTITION BY LIST(store_id) (

 PARTITION p1

 VALUES IN (1, 3, 4, 17)

 INDEX DIRECTORY = '/var/orders/district1'

 DATA DIRECTORY = '/var/orders/district1',

 PARTITION p2

 VALUES IN (2, 12, 14)

 INDEX DIRECTORY = '/var/orders/district2'

 DATA DIRECTORY = '/var/orders/district2',

 PARTITION p3

 VALUES IN (6, 8, 20)

 INDEX DIRECTORY = '/var/orders/district3'

 DATA DIRECTORY = '/var/orders/district3',

 PARTITION p4

 VALUES IN (5, 7, 9, 11, 16)

 INDEX DIRECTORY = '/var/orders/district4'

 DATA DIRECTORY = '/var/orders/district4',

 PARTITION p5

 VALUES IN (10, 13, 15, 18)

 INDEX DIRECTORY = '/var/orders/district5'

 DATA DIRECTORY = '/var/orders/district5'

);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

插入记录:


insert into orders_list2(id, customer_surname, store_id, salesperson_id, order_date, note)

values(1, "yang", 1, 1, CURDATE(), "testing");

insert into orders_list2(id, customer_surname, store_id, salesperson_id, order_date, note)

values(2, "yang", 2, 2, CURDATE(), "testing");

insert into orders_list2(id, customer_surname, store_id, salesperson_id, order_date, note)

values(6, "yang", 6, 6, CURDATE(), "testing");

insert into orders_list2(id, customer_surname, store_id, salesperson_id, order_date, note)

values(8, "yang", 8, 8, CURDATE(), "testing");

insert into orders_list2(id, customer_surname, store_id, salesperson_id, order_date, note)

values(5, "yang", 5, 5, CURDATE(), "testing");

insert into orders_list2(id, customer_surname, store_id, salesperson_id, order_date, note)

values(10, "yang", 10, 10, CURDATE(), "testing");

1

2

3

4

5

6

7

8

9

10

11

12

步骤三:到指定新路径下验证。

[root@f033b3fe25e2 orders]# tree

.

├── district1

│   └── test

│   └── orders_list2#P#p1.ibd

├── district2

│   └── test

│   └── orders_list2#P#p2.ibd


├── district3

│   └── test

│   └── orders_list2#P#p3.ibd


├── district4

│   └── test

│   └── orders_list2#P#p4.ibd


└── district5

 └── test

 └── orders_list2#P#p5.ibd

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

10 directories, 5 files

[root@f033b3fe25e2 orders]# pwd

/var/orders

1

2

3

查询验证:


mysql> explain partitions select * from orders_list2;

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

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |

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

| 1 | SIMPLE | orders_list2 | p1,p2,p3,p4,p5 | ALL | NULL | NULL | NULL | NULL | 11 | NULL |

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

1 row in set (0.00 sec)

1

2

3

4

5

6

7

步骤四:新增分区处理。

场景假设:比如最新的数据,我们想存储到SSD硬盘上。可以通过增加指定路径的分区文件达到目的。


ALTER TABLE orders_list2  ADD PARTITION (PARTITION p6 VALUES IN  (21,22,23)

DATA DIRECTORY = '/var/ssd_testing'  INDEX DIRECTORY = '/var/ssd_testing');


[root@f033b3fe25e2 var]# tree ssd_testing/

ssd_testing/

└── test

 └── orders_list2#P#p6.ibd

1

2

3

4

5

6

7

六个分区结果:


mysql> explain partitions select * from orders_list2;

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

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |

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

| 1 | SIMPLE | orders_list2 | p1,p2,p3,p4,p5,p6 | ALL | NULL | NULL | NULL | NULL | 12 | NULL |

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

1 row in set (0.00 sec)

1

2

3

4

5

6

7

参考:https://dev.mysql.com/doc/refman/5.6/en/tablespace-placing.html

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
581
分享
相关文章
MySQL底层概述—2.InnoDB磁盘结构
InnoDB磁盘结构主要包括表空间(Tablespaces)、数据字典(Data Dictionary)、双写缓冲区(Double Write Buffer)、重做日志(redo log)和撤销日志(undo log)。其中,表空间分为系统、独立、通用、Undo及临时表空间,分别用于存储不同类型的数据。数据字典从MySQL 8.0起不再依赖.frm文件,转而使用InnoDB引擎存储,支持事务原子性DDL操作。
277 100
MySQL底层概述—2.InnoDB磁盘结构
【赵渝强老师】达梦数据库的逻辑存储结构
本文介绍了达梦数据库的存储结构,包括逻辑和物理存储两部分。逻辑存储结构由数据库(Database)、表空间(Tablespaces)、段(Segments)、簇(Cluster)和页(Page)组成。数据库是最大逻辑单元,包含所有表、索引等;表空间由数据文件组成,用于存储对象;段由簇构成,簇包含连续的数据页;页是最小存储单元。文中还提供了查询表空间、段和页大小的SQL语句,并附有视频讲解和示意图。
【赵渝强老师】达梦数据库的物理存储结构
本文介绍了达梦数据库的存储结构及各类物理文件的作用。达梦数据库通过逻辑和物理存储结构管理数据,包含配置文件(如dm.ini、sqllog.ini)、控制文件(dm.ctl)、数据文件(*.dbf)、重做日志文件(*.log)、归档日志文件、备份文件(*.bak)等。配置文件用于功能设置,控制文件记录数据库初始信息,数据文件存储实际数据,重做日志用于故障恢复,归档日志增强数据安全性,备份文件保障数据完整性,跟踪与事件日志辅助问题分析。这些文件共同确保数据库高效、稳定运行。
图解MySQL【日志】——磁盘 I/O 次数过高时优化的办法
当 MySQL 磁盘 I/O 次数过高时,可通过调整参数优化。控制刷盘时机以降低频率:组提交参数 `binlog_group_commit_sync_delay` 和 `binlog_group_commit_sync_no_delay_count` 调整等待时间和事务数量;`sync_binlog=N` 设置 write 和 fsync 频率,`innodb_flush_log_at_trx_commit=2` 使提交时只写入 Redo Log 文件,由 OS 择机持久化,但两者在 OS 崩溃时有丢失数据风险。
71 3
PolarDB开源数据库进阶课3 共享存储在线扩容
本文继续探讨穷鬼玩PolarDB RAC一写多读集群系列,介绍如何在线扩容共享存储。实验环境依赖《在Docker容器中用loop设备模拟共享存储》搭建。主要步骤包括:1) 扩容虚拟磁盘;2) 刷新loop设备容量;3) 使用PFS工具进行文件系统扩容;4) 更新数据库实例以识别新空间。通过这些步骤,成功将共享存储从20GB扩容至30GB,并确保所有节点都能使用新的存储空间。
42 1
MySQL进阶突击系列(09)数据磁盘存储模型 | 一行数据怎么存?
文中详细介绍了MySQL数据库中一行数据在磁盘上的存储机制,包括表空间、段、区、页和行的具体结构,以及如何设计和优化行数据存储以提高性能。
MySQL原理简介—5.存储模型和数据读写机制
本文介绍了MySQL中InnoDB存储引擎的物理存储结构和读写机制。主要内容包括: 1. 为什么不能直接更新磁盘上的数据 2. 数据页的概念 3. 一行数据的存储 4. 数据头的内容 5. 行溢出和溢出页 6. 数据页的物理结构 7. 表空间的物理结构 8. InnoDB存储模型及读写机制总结 这些机制共同确保了InnoDB在高并发场景下的高效运行和数据一致性。
时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍
化工行业在数字化转型过程中面临数据接入复杂、实时性要求高、系统集成难度大等诸多挑战。福州力川数码科技有限公司科技依托深厚的行业积累,精准聚焦行业痛点,并携手 TDengine 提供高效解决方案。
62 0
列式存储数据库与超市的关系?
列式存储数据库是一种高效的数据管理方式,类似于超市将相似商品集中摆放。它将相同类型的数据(如年龄、价格)归类存储,便于快速查询和压缩,广泛应用于市场分析、财务报告和健康数据分析等领域。知名产品包括HBase、ClickHouse、Druid和Apache Cassandra等,适合处理大规模数据和实时分析任务。
70 4
快速搭建南大通用GBase 8s数据库SSC共享存储集群
本文介绍如何GBase8s 数据库 在单机环境中快速部署SSC共享存储集群,涵盖准备工作、安装数据库、创建环境变量文件、准备数据存储目录、修改sqlhost、设置onconfig、搭建sds集群及集群检查等步骤,助你轻松完成集群功能验证。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等