MySQL DDL操作--------指定表数据文件存放目录最佳实战

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

1. 背景

   * 在MYSQL中建立一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm文件跟数据库存储引擎无关,也就是任何存储引擎的数据表都必须有.frm文件,命名方式为数据表名.frm,如user.frm. .frm文件可以用来在数据库崩溃时恢复表结构。

   * MySQL文件包括MySQL所建数据库文件和MySQL所用引擎创建的数据库文件。

   * .frm 文件与操作系统和数据库引擎无关,都有这么个与表名同名文件。

   * MyISAM引擎的文件:

     * .myd 即 my data,表数据文件

     * .myi 即my index,索引文件

     * .log 日志文件。

   * InnoDB引擎的文件:

     * 采用表空间(tablespace)来管理数据,存储表数据和索引,

     * InnoDB数据库文件(即InnoDB文件集,ib-file set)。

     * ibdata1、ibdata2等:系统表空间文件,当未开启innodb_file_per_table时,存储InnoDB系统信息和用户数据库表数据和索引,所有表共用。

     * .ibd文件:当开启innodb_file_per_table时,单表表空间文件,每个表使用一个表空间文件(file per table),存放用户数据库表数据和索引。

     * 日志文件: ib_logfile1、ib_logfile2。

   * 指定的目录必须是目录的完整路径名,而不是相对路径。


2. MySQL 环境

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
32
33
34
35
Welcome  to  the MySQL monitor.  Commands  end  with  or  \g.
Your MySQL  connection  id  is  4
Server version: 5.7.18 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2017, Oracle  and / or  its affiliates.  All  rights reserved.
 
Oracle  is  a registered trademark  of  Oracle Corporation  and / or  its
affiliates. Other names may be trademarks  of  their respective
owners.
 
Type  'help;'  or  '\h'  for  help. Type  '\c'  to  clear the  current  input statement.
 
mysql> show variables  like  'version' ;
+ ---------------+--------+
| Variable_name | Value  |
+ ---------------+--------+
| version       | 5.7.18 |
+ ---------------+--------+
1 row  in  set  (0.01 sec)
 
mysql> show variables  like  'datadir' ;
+ ---------------+-------------------+
| Variable_name | Value             |
+ ---------------+-------------------+
| datadir       | /data/mysql_data/ |
+ ---------------+-------------------+
1 row  in  set  (0.04 sec)
 
mysql> show variables  like  'innodb_file_per%' ;
+ -----------------------+-------+
| Variable_name         | Value |
+ -----------------------+-------+
| innodb_file_per_table |  ON     |
+ -----------------------+-------+
1 row  in  set  (0.02 sec)


3. MyISAM引擎指定表数据文件存放目录例子

   * 创建表数据文件存放目录

1
2
[root@MySQL ~] # mkdir -v /test_myisam
mkdir : created directory ` /test_myisam '


  * 查看mysqld 运行用户

1
2
3
[root@MySQL ~] # ps aux | grep mysqld | grep -v grep
root       1468  0.0  0.0 110400  1532 ?        S    16:00   0:00  /bin/sh  /usr/local/mysql/bin/mysqld_safe  --datadir= /data/mysql_data  --pid- file = /data/mysql_data/MySQL .pid
mysql      1614  0.2  4.9 1309380 194788 ?      Sl   16:00   0:04  /usr/local/mysql/bin/mysqld  --basedir= /usr/local/mysql  --datadir= /data/mysql_data  --plugin- dir = /usr/local/mysql/lib/plugin  --user=mysql --log-error= /data/mysql_data/error .log --pid- file = /data/mysql_data/MySQL .pid


  * 修改目录所属用户与组为mysql运行用户 [ 此步必须 ]

1
2
[root@MySQL ~] # chown -v  mysql.mysql /test_myisam 
changed ownership of ` /test_myisam ' to mysql:mysql


   * 创建表 test_myisam, 并指定数据文件与索引文件存放目录 

     [ MyISAM引擎中表数据文件与索引文件分开存放,,需要分别指定 ]

1
2
3
4
CREATE  TABLE  test_myisam(
     -> id  BIGINT  PRIMARY  KEY  NOT  NULL  AUTO_INCREMENT,
     ->  name  VARCHAR (64)  NOT  NULL
     -> )ENGINE=MYISAM DATA DIRECTORY= '/test_myisam'  INDEX  DIRECTORY= '/test_myisam'   DEFAULT  CHARSET=utf8mb4;


   * 查看表数据文件与表结构文件

   [ 可以看到在MyISAM存储引擎中,指定表数据目录是通过软链接方式实现 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql>  select  database ();
+ ------------+
database () |
+ ------------+
| mytest     |
+ ------------+
1 row  in  set  (0.00 sec)
mysql> system ls -l /data/mysql_data/mytest
total 16
-rw-r ----- 1 mysql mysql   67 Jul  5 16:30 db.opt
-rw-r ----- 1 mysql mysql 8586 Jul  5 16:37 test_myisam.frm
lrwxrwxrwx 1 mysql mysql   28 Jul  5 16:37 test_myisam.MYD -> /test_myisam/test_myisam.MYD
lrwxrwxrwx 1 mysql mysql   28 Jul  5 16:37 test_myisam.MYI -> /test_myisam/test_myisam.MYI
 
mysql> system ls -l /test_myisam
total 4
-rw-r ----- 1 mysql mysql    0 Jul  5 16:37 test_myisam.MYD
-rw-r ----- 1 mysql mysql 1024 Jul  5 16:37 test_myisam.MYI


4. InnoDB引擎指定表数据文件存放目录例子

  * 创建表数据文件存放目录

1
2
[root@MySQL ~] # mkdir -v /test_innodb
mkdir : created directory ` /test_innodb '


   * 查看mysqld 运行用户

1
2
3
[root@MySQL ~] # ps aux | grep mysqld | grep -v grep
root       1468  0.0  0.0 110400  1532 ?        S    16:00   0:00  /bin/sh  /usr/local/mysql/bin/mysqld_safe  --datadir= /data/mysql_data  --pid- file = /data/mysql_data/MySQL .pid
mysql      1614  0.1  5.0 1309380 196576 ?      Sl   16:00   0:04  /usr/local/mysql/bin/mysqld  --basedir= /usr/local/mysql  --datadir= /data/mysql_data  --plugin- dir = /usr/local/mysql/lib/plugin  --user=mysql --log-error= /data/mysql_data/error .log --pid- file = /data/mysql_data/MySQL .pid


   * 修改目录所属用户与组为mysql运行用户 [ 此步必须 ]

1
2
[root@MySQL ~] # chown -v mysql.mysql /test_innodb
changed ownership of ` /test_innodb ' to mysql:mysql


   * 创建表 test_innodb, 并指定数据文件存放目录 

     [ InnoDB 引擎中表数据文件与索引文件合并存放,,指定数据文件存放目录即可 ]

1
2
3
4
5
mysql>  CREATE  TABLE  test_innodb(
     -> id  BIGINT  PRIMARY  KEY  NOT  NULL  AUTO_INCREMENT,
     ->  name  VARCHAR (64)  NOT  NULL
     -> )ENGINE=INNODB DATA DIRECTORY= '/test_innodb'  DEFAULT  CHARSET=utf8mb4;
Query OK, 0  rows  affected (0.06 sec)


    * 查看表数据文件

   [ 可以看到在InnoDB中会生成<table_name>.isl文件,此文件记录表数据文件存放绝对路径 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> system ls -l /test_innodb
total 4
drwxr-x --- 2 mysql mysql 4096 Jul  5 16:47 mytest
mysql> system ls -l /test_innodb/mytest
total 96
-rw-r ----- 1 mysql mysql 98304 Jul  5 16:47 test_innodb.ibd
 
mysql>  select  database ();
+ ------------+
database () |
+ ------------+
| mytest     |
+ ------------+
1 row  in  set  (0.00 sec)
 
mysql> system ls -l /data/mysql_data/mytest
total 20
-rw-r ----- 1 mysql mysql   67 Jul  5 16:30 db.opt
-rw-r ----- 1 mysql mysql 8586 Jul  5 16:47 test_innodb.frm
-rw-r ----- 1 mysql mysql   35 Jul  5 16:47 test_innodb.isl
mysql> system cat /data/mysql_data/mytest/test_innodb.isl
 
/test_innodb/mytest/test_innodb.ibd


5. 总结


以需求驱动技术,技术本身没有优略之分,只有业务之分。




      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1945444,如需转载请自行联系原作者





相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
SQL 存储 关系型数据库
菜鸟之路Day29一一MySQL之DDL
本文《菜鸟之路Day29——MySQL之DDL》由作者blue于2025年5月2日撰写,主要介绍了MySQL中的数据定义语言(DDL)。文章详细讲解了DDL在数据库和表操作中的应用,包括数据库的查询、创建、使用与删除,以及表的创建、修改与删除。同时,文章还深入探讨了字段约束(如主键、外键、非空等)、常见数据类型(数值、字符串、日期时间类型)及表结构的查询与调整方法。通过示例代码,读者可以更好地理解并实践MySQL中DDL的相关操作。
454 11
|
SQL 关系型数据库 MySQL
MySQL 5.6/5.7 DDL 失败残留文件清理指南
通过本文的指南,您可以更安全地处理 MySQL 5.6 和 5.7 版本中 DDL 失败后的残留文件,有效避免数据丢失和数据库不一致的问题。
|
SQL 监控 关系型数据库
MySQL补充性文件
通过以上内容,您可以全面了解和掌握 MySQL 补充性文件的配置、查看及其作用,从而提升数据库管理的效率和质量。
480 36
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
529 22
 MySQL秘籍之索引与查询优化实战指南
|
安全 关系型数据库 MySQL
MySQL8使用物理文件恢复MyISAM表测试
MySQL8使用物理文件恢复MyISAM表测试
302 0
|
SQL 监控 关系型数据库
MySQL如何优雅的执行DDL
在MySQL中优雅地执行DDL操作需要综合考虑性能、锁定和数据一致性等因素。通过使用在线DDL工具、分批次执行、备份和监控等最佳实践,可以在保障系统稳定性的同时,顺利完成DDL操作。本文提供的实践和案例分析为安全高效地执行DDL操作提供了详细指导。
702 14
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
9月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
578 158
|
9月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

推荐镜像

更多