MySQL 的数据目录

1. MySQL 的主要目录结构

  • 方式1:通过命令搜索
find / -name mysql
  • 方式2(推荐):通过查看配置文件获取目录结构
vim /etc/my.cnf
  • (重要)- my.cnf 配置信息说明
[mysqld]
bind-address=0.0.0.0
port=3306 # 端口号
user=mysql # 用户
basedir=/usr/local/mysql #指定的是mysql 安装目录
datadir=/data/mysql #指定的是mysql数据目录
socket=/tmp/mysql.sock #mysql端口存放文件
log-error=/data/mysql/mysql_err.log # mysql 错误日志文件
pid-file=/data/mysql/mysql.pid # mysql 进程文件
#skip_ssl #关闭SSL加密连接
character_set_server=utf8mb4 # 指定数据服务字符集
symbolic-links=0
explicit_defaults_for_timestamp=true
lower_case_table_names=1 # mysql在windows下,默认是对表名大小写不敏感的,但是在[linux下,一些系统需要手动设置
#skip-grant-tables #免密码登陆
  • basedir:指定的是 mysql 安装目录
  • datadir:指定的是 mysql 数据目录
  • socket:mysql端口存放文件
  • log-error=/data/mysql/mysql_err.log:mysql 错误日志文件
  • character_set_server=utf8mb4 :指定数据服务字符集
  • skip_ssl : 关闭SSL加密连接
  • lower_case_table_names=1 : mysql在windows下,默认是对表名大小写不敏感的,但是在[linux下,一些系统需要手动设置。
  • skip-grant-tables :免密码登陆 (用户修改账号密码,上面文件没该配置)

1.1 数据库文件的存放路径 -(数据目录)

MySQL 服务器程序在启动是会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目录就称为为数据目录(对应 数据库的库,表等文件)。

MySQL 数据库文件的存放路径:(默认为:/var/lib/mysql

其实数据目录对应着一个系统变量 datadir(该变量是全局系统变量),我们可以通过该系统变量查询 数据目录 的地址:

SELECT @@global.datadir;
# 或
SHOW GLOBAL VARIABLES LIKE '%datadir%';

1.2 相关命令目录 - (安装目录)

  • 方式1:通过命令搜索
find / -name "mysqladmin"
find / -name "mysqldump"
  • 方式2(推荐):查询数据库系统变量 basedir(该变量是全局系统变量)
SELECT @@global.basedir;
# 或
SHOW GLOBAL VARIABLES LIKE '%basedir%';

安装目录 下非常主要的 bin 目录,它里边放着许多关于控制客户端和服务器程序的命令。许多可执行文件,比如:

  • mysql:客户端(登录)命令
  • mysqld:启动数据库实例命令
  • mysqladmin:修改数据库用户密码命令
  • mysqldump:备份/导出 数据库命令

等...

1.2.1 mysqld服务和mysql服务启动程序

  • mysqld
1. mysqld就是mysql server,负责管理对mysql数据的访问。且 mysql server 有一套系统变量。
2. 当mysql server启动后,它会监听来自客户端的网络连接,并代表客户端管理数据库连接。
3. 可以影响mysql运行时的操作,系统变量可以在mysql server启动时设置,很多系统变量可以在mysql server运行时改变,用于动态影响服务器配置。
4. 用于显示mysql运行信息,包括运行性能特征。
5. mysql server 有一套命令参数。shell> `mysqld --verbose --help ``#``可以获取所有的命令参数
  • mysqld_safe

    mysql server 启动脚本。

  • mysql.server

    mysql server 启动脚本。

  • mysqld_multi

    mysql server启动脚本

1.2.2 mysql客户端命令

  • mysql:mysql客户端登录或数据导入命令
  • mysqldump:mysql数据导出命令
  • mysqlcheck:检查、修复、分析以及优化表的表维护
  • mysqladmin:用来检索版本、进程、以及服务器的状态信息
一、MySQL服务器端工具
1.mysqld:SQL后台保护程序(MySQL服务器进程)。该程序必须运行之后。客户端才能通过连接服务器端程序访问和操作数据库
2.mysqld_safe:MySQL服务脚本。mysql_safe增加了一些安全特性,如当出现错误时重启服务器,向错误日志文件写入运行时间信息
3.mysql.server:MySQL服务启动服本。调用mysqld_safe来启动MySQL服务
4.mysql_multi:服务器启动脚本,可以启动或停止系统上安装的多个服务
5.myiasmchk:用来描述、检查、优化和维护MyISAM表的实用工具
6.mysqlbug:MySQL缺陷报告脚本。它可以用来向MySQL邮件系统发送缺陷报告
7.mysql_install_db:用于默认权限创建MySQ授权表。通常只是在系统上首次安装MySQL时执行一次
clear
一、MySQL客户端工具
1.myisampack:压缩MyISAP表,产生更小的只读表
2.mysql:交互式输入SQL语句或从文件以批处理模式执行SQL语句来操作数据库管理系统
3.mysaqlaccess:检查访问主机名、用户名和数据库组合的权限
4.mysqladmin:用来检索版本、进程、以及服务器的状态信息
5.mysqlbinlog:用于从二进制日志读取语句。在二进制日志文件中包含执行的语句,可用来帮助系统从崩溃中恢复
6.mysqlcheck:检查、修复、分析以及优化表的表维护
7.mysqldump:将MySQL数据库转储到一个文件
8.mysqlhotcopy:当服务器在运行时,快速备份MyISAM或ISAM表的工具
9.mysql import:使用load data infile将文本文件导入相关表的客户程序
10.perror:显示系统或MySQL错误代码含义的工具

1.3 配置文件目录 -(配置目录)

  1. /etc/my.cnf

  2. 还有一个配置文件一般在 share 目录下:可通过 find 搜索命令查找

find / -name mysql

2. 数据库和文件系统的关系

InnoDBMyISAM 这样的存储引擎都是把表存储在磁盘上的,操作系统用来管理磁盘的结构被称为文件系统,换句话来说就是:InnoDBMyISAM这样的存储引擎都是把表存储在文件系统上的。

  • 读数据:当我们想读数据的时候,存储引擎会从文件系统中把数据读出来返回给我们。
  • 写数据:当我们想写数据的时候,存储引擎会把这些数据写入到文件系统中。

个人理解:文件系统就是存放数据的系统。而数据是通过存储引擎读写到文件系统中的。所以存储引擎就是 "笔",文件系统就是 "纸"

2.1 查看默认数据库

查看当前数据库实例中都有哪些数据库:

SHOW DATABASES;
# 结果集
information_schema
mysql
performance_schema
sys

可以看到有4个数据库是属于MySQL自带的系统数据。

mysql

MySQL 系统自带的核心数据库,它存储了 MySQL 的用户账户和权限信息,一些存储过程,事件的定义信息,一些运行过程中的产生的日志信息,一些帮助信息以及时区信息等。

information_schema

MySQL 系统自带的数据库,这个数据保库存着 MySQL 服务器 维护的所有其他数据库的信息,比如有哪些表,哪些视图,哪些触发器,哪些列,哪些索引。这些信息并不是真实的用户数据,而是一些描述性信息,又称为元数据。该库中该提供了一些以innodb_sys开头的表,用于表示内部系统表。

performance_schema

MySQL 系统自带的数据库,这个数据库里主要保存 MySQL 服务器运行过程中的一些状态信息,可以用来 监控MySQL服务的各类性能指标。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况信息。

sys

MySQL 系统自带的数据库,这个数据库主要是通过 "视图(view)" 的形式把 information_schema performance_schema 结合起来,帮助系统管理员和开发人员监控 MySQL 的技术性能。

2.2 数据库在文件系统中的表示

当我们使用 "create database 数据库名" 语句创建一个数据库的时候,在 "文件系统" 上实际发生了什么呢?(两件事)

  1. 会在数据库服务对应的 "数据目录" 下创建一个和数据库名同名的子目录。
  2. 在与该数据库名同名的子目录下创建一个名为 "db.opt" 的文件(仅限 5.7 及之前的版本),这文件中包含了数据库的各种属性。

2.3 表在文件系统中的表示

数据其实都是以 "记录的形似" 插入到表中的,每个表的信息其实可以分为两种:

  • 表结构的定义(".frm")
  • 表中的数据(".ibd")

表结构就是:(ddl)定义语句。包含了,表名,列,列数据类型,约束等...

2.3.1 InnoDB 存储引擎模式

2.3.1.1 文件系统中的数据库文件中文件的表示:

5.7.xx

  • db.opt:用来存储该数据库的信息,例如:字符集,比较规则,存储引擎等其他信息。
  • xx.frm:用来存储 xx表结构信息的,例如,表名,哪些列,列的数据类型,约束,存储引擎等其他信息。
  • xx.ibd:用来存储 xx表的数据的(.ibd 又称为:独立表空间)。但表中的数据也有可能会存储在(系统表空间中:ibdatal)

8.0.xx

  • xx.ibd:用来存储 xx表的数据以及表结果信息的,相比 5.7.xx 来说,8.0 将 ".frm" 和 ".ibd" 合并在了一起(.ibd 又称为:独立表空间)。但表中的数据也有可能会存储在(系统表空间中:ibdatal)
2.3.1.2 表中数据和索引

....哈哈哈现在还不懂...

2.3.1.3 系统表空间
  • 默认情况下,"InnoDB" 会在 "数据目录" 下创建一个名为 ""ibdata1"",大小为 ""12M"" 的文件,该文件就对应着 "系统表空间"(该文件是自扩展文件)。
  • 修改系统表空间配置(my.cnf / ny.ini):
[server]
innodb_data_file_path=data1:512M;data2:512M:autoextend

配置说明:会创建这两个512M大小的文件作为 "系统表空间",其中 "autoextend" 表示空间不足后自动扩展那个文件。

注意:在一个 MySQL服务器中,"系统表空间"只有一份。从 5.5.7 ~ 5.6.6 之间的版本,默认将表中的数据存储到 "系统表空间" 中。

2.3.1.4 系统表空间
  • 独立表空间:就是 为每一个表建立一个独立存储空间。有多少张表,就有多少个独立表空间。
  • 使用 "独立表空间" 来存储表数据的话,会在该表所属数据库对应的数据目录中创建一个表示 "独立表空间" 的文件,文件名和表名相同,扩展名为 ".ibd"
表名.ibd

"表名.ibd" 文件主要是用来存储 "表名"中的数据和索引。

8.0 之后是用来存储 "表"中的表结构信息和数据以及索引。

2.3.1.5 (系统 / 独立)表空间查看及设置

**我们可以通过设置 innodb_file_per_table 来指定使用的是 系统表空间 还是独立表空间。 **

  • 查看表空间设置 - (该系统变量是全局系统变量)
SELECT @@global.innodb_file_per_table;
# 或
SHOW VARIABLES LIKE '%innodb_file_per_table%';
# 0:表示使用系统表空间,1:表示使用独立表空间
  • 表空间设置
  1. 方式1:通过配置文件设置(my.cnf / my.ini)。该方式需要重启服务才生效
[server]
innodb_file_per_table = 0; # 0:表示使用系统表空间,1:表示使用独立表空间
  1. 方式2:通过修改系统变量的方式。该方式重启服务后会失效
SET innodb_file_per_table = 0; # 0:表示使用系统表空间,1:表示使用独立表空间
# 或
SET @@global.innodb_file_per_table = 0;
# 或
SET GLOBAL innodb_file_per_table = 0;

注意:innodb_file_per_table 参数的修改 只对新建的表起作用,对于已经分配了表空间的表并不起作用。

  • 如果我们想把已经存在 "系统表空间"-(表转移到)-> "独立表空间"中,可以使用以下语法:
ALTER TABLE 表名 TABLESPACE [=] innodb_file_per_table;
  • 或者把已经存在 "独立表空间"-(表转移到)-> "系统表空间"中,可以使用以下语法:
ALTER TABLE 表名 TABLESPACE [=] innpdb_system;

2.3.2 MyISAM 存储引擎模式

2.3.2.1 表结构

存储表结构和 InnoDB 和 MyISAM 方式一样

表名.frm
2.3.2.2 表中数据和索引

在 MyISAM 中的引擎全部都是 "二级索引",该引擎的 "数据和索引是分开" 的。所以在 "文件系统" 中也是使用不同的文件来存储数据文件和索引文件的。

  • MySQL 5.7.x
表名.frm 	#存储表结构
表名.MYD #存储表数据 (MYData)
表名.MYI #存储表索引 (MYIdex)
  • MySQL 8.0
表名_myisam_x.sdi 	#存储元数据
表名_myisam.MYD #存储表数据 (MYData)
表名_myisam.MYI #存储表索引 (MYIdex)
  • 对于 "InnoDB "表,SDI 与 "InnoDB" 用户表空间中的数据一起存储。
  • 对于 "MyISAM" 和其他存储引擎,它被写入数据目录中的 ".sdi" 文件中。
  • 在 8.0 之后 MyISAM 引擎和 InnoDB 引擎一样去掉了 ".frm" 文件,将数据放入了 ".sdi" 文件中。

注意:在MySQL 8.0中,MyISAM 存储引擎不提供分区支持。以前的版本在 8.0 中不能使用。

2.x 扩展

".frm"在MySQL中不存在了,那去了那里

放入了 ".ibd" 文件中,写入了 "ibd" 文件内部。可以通过 MySQL 安装时自带的(ibd2sdi)命令工具解析查看。

  • 到存储 "ibd" 文件目录下,执行下面的命令:
ibd2sdi --dump-file=xxx.txt xxx.ibd
# 命令解析说明:
 xxx.txt:表示解析后的新文件
 xxx.ibd:表示你要解析的文件

2.4 小结

2.4.1 InnoDB

如果"某表"采用 "InnoDB" ,就会在 "文件系统" 中的 "数据库目录" 下产生1个或者2个文件,如下:

  • "表名.frm":描述表结构文件,字段长度等...
  • 如果采用 "系统表空间" 模式,数据信息和索引信息都会存储在 "ibdata1" 中(默认的,也可以自定义)
  • 如果采用 "独立表空间" 模式, "文件系统" 中的 "数据库目录" 中产生 "表名.ibd" 文件用来存储数据信息和索引信息。

此外:

  1. 5.7 中 "数据库目录" 中还会产生 "db.opt"文件用于保存数据库的相关配置。字符集,比较规则等...。而 8.0 不再提供 db.opt 文件
  2. 8.0 中 不再单独提供 "表名.frm",而是合并在 "表名.ibd" 文件中了。

2.4.2 MyISAM

  • 如果"某表"采用 "MyISAM" ,就会在 "文件系统" 中的 "数据库目录" 下产生3个文件,如下:
  • 5.7 中:"表名.frm":用来描述表结构文件,字段长度等等..
  • 8.0 中:"表名_myisam_x.sdi":用来描述表结构文件,字段长度等等..
  • 表名.MYD (MYData):数据信息文件,存储数据信息的文件(如果采用 独立表空间的存储模式)
  • 表名.MYI (MYIndex):存储索引信息文件

2.5 视图在文件喜宴中的表示

MySQL 中的 "视图" 其实是 "虚拟的表"。所以在存储 "视图" 的时候不需要存储真实的数据,只需要把它的结果存储起来就就行了。和表一样,描述 "视图" 结构的文件也会被存储到所属数据库对应的子目录中,但只会存储一个 "视图名.frm" 的文件。

视图名.frm

2.6 其他文件

  • 服务器进程文件

    每运行一个MySQL服务器程序,都意味着启动一个进程。MySQL 服务器会把自己的进程ID写入到一个文件中。

  • 服务器日志文件

    在服务器运行过程中,会产生各种各样的日志,比如常规的查询日志,错误日志,二进制日志,redo日志等。

  • 默认/自动生成的 SSL 和 RSA 证书和密钥文件

    主要是为了客户端和服务器安全通信而创建的一些文件。

MySQL 数据目录的更多相关文章

  1. centos6.4 挂载新盘并移动mysql数据目录

    1 centos 挂载新盘并格式化 以vmware workstation12 中安装的centos6. 虚拟机为例进行演示 关机,添加硬盘 开机,格式化硬盘,并挂载 通过命令查看硬盘 fdisk – ...

  2. 更换mysql数据目录后出现ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) 的解决办法

    服务器上的mysql默认数据目录为/var/lib/mysql/,同时服务器的/空间不是很大,而近期又有大量的日志需要导入进行分析,时常搞得/的空间捉襟见肘,晚上一狠心就想把mysql的数据目录转移到 ...

  3. 阿里云安装LNMP以及更改网站文件和MySQL数据目录

    LNMP安装了哪些软件?安装目录在哪LNMP相关软件安装目录Nginx 目录: /usr/local/nginx/MySQL 目录 : /usr/local/mysql/MySQL数据库所在目录:/u ...

  4. linux mysql 数据目录文件夹移动及所遇到的问题

    一 .如果是fedora下用rpm包安装的mysql,修改方法如下: 如果这里说的不够清楚,可以到http://www.vipkj.net/post-839.html给我留言 MySQL默认的数据文件 ...

  5. MySQL数据目录更改及相关问题解决方案

    步骤相关 1.停掉MySQL服务 service mysql stop 2.把旧的数据目录/var/lib/mysql备份到新的数据目录/data/mysql cp /var/lib/mysql /d ...

  6. 【转】如何将MySQL数据目录更改为CentOS 7上的新位置

    本文转载自:http://www.leftso.com/blog/362.html 介绍 数据库随着时间的推移而增长,有时超过了文件系统的空间.当它们与操作系统的其他部分位于同一分区上时,也可能遇到I ...

  7. Centos7上修改mysql数据目录

    通过yum安装的mysql,启动和增加数据库,增加数据如下: [root@wucl-4 lib]# systemctl start mariadb [root@wucl-4 lib]# mysql - ...

  8. 更换mysql数据目录后出现 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) 的解决办法

    服务器上的mysql默认数据目录为/var/lib/mysql/,同时服务器的/空间不是很大,而近期又有大量的日志需要导入进行分析,时常搞得/的空间捉襟见肘,晚上一狠心就想把mysql的数据目录转移到 ...

  9. MySQL数据目录(data)迁移

    因为系统分区的空间不足,添加了一块硬盘,挂载到/data目录下,把MySQL的数据目录(data)迁移过去. 1.停止MySQL服务: [root@zabbix mysql]# service mys ...

  10. Windows下MySQL数据目录修改

    最近在弄一个项目,需要修改windows下面的mysql的数据目录(mysql默认是存储在C盘的,这个不太好,未来一定会满了的). 我的 mysql 是安装版,版本是 5.7. 1.首先,需要知道my ...

随机推荐

  1. 微信小程序 setData accepts an Object rather than some undefined 解决办法

    问题 setData accepts an Object rather than some undefined setData接受一个对象而不是一些定义 让我猜猜, 你一定是在加载index页面(首页 ...

  2. Lua5.3 笔记

    Lua5.3 笔记 最近用skynet,sproto通讯,完全看不懂通讯二进制是怎么写的,发现都是string这个,string那个,完全理解不来. 于是查了一下string.pack的api,和之前 ...

  3. 拯救Win7,2023该如何正确升级?

    对于现存的Win7系统用户,微软曾多次提醒将在2023年1月停止对Win7与Win8.1的安全更新和技术支持.而转眼已经来到2023,时间已到,对于Win7,微软已经再也不管了,停止为Win7用户提供 ...

  4. 8月Node服务的3场事故

    有句话叫每一起严重事故的背后,必然有 29 次轻微事故和 300 起未遂先兆以及 1000 起事故隐患. 而我最近更是碰到了 3 起比较严重的线上事故,都是大意惹的祸. 一.数据库锁死 第一起事故发生 ...

  5. Python并发编程——操作系统发展史、多道技术、进程理论、开启进程、join方法、进程间的数据隔离

    文章目录 必备知识回顾 今日内容详细 操作系统发展史 多道技术 必备知识点 多道技术图解 多道技术重点知识 进程理论 必备知识点 进程调度 进程运行的三状态图 两对重要概念 开启进程的两种方式 joi ...

  6. Go 常用命令介绍

    Go 常用命令 目录 Go 常用命令 一.Go 常用命令 1.1 go build 1.1.1 指定输出目录 1.1.2 常用环境变量设置编译操作系统和 CPU 架构 1.1.3 查看支持的操作系统和 ...

  7. Jmeter调用Python脚本,实现参数互相传递

    首先传值到python 1:新增取样器--->os进程取样器 2:新建.bat文件 (写python脚本的路径和传参的个数:思路是:jmeter调用shell,用shell执行py) F:cd ...

  8. Angular2 通过自定义指令限制输入框输入类型

    ** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/16814577.html 在input控件中,使用type="n ...

  9. vue 基于原生动画的自动滚动表格

    前言 公司展示大屏需要写滚动表格,通过滚动播放数据,自己随便摸了一个基于动画的自动滚动表格 原理 根据每行的大小和设置的每行滚动时间设置滚动位置,动态添加动画,并把数组第一项移动到最后一项,并订阅该动 ...

  10. Trino容错模式深度测评与思考

    本文分享自华为云社区<走向批处理-交互式分析一体化: Trino容错模式深度测评与思考>,作者:HetuEngine九级代言 . 本文系华为云大数据研发团队原创,原创作者:文博,梦月 1 ...