MySQL 中的目录和文件
2022/1/1 19:11:10
本文主要是介绍MySQL 中的目录和文件,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
MySQL学习系列
bin 目录
在 MysQL 的安装目录下有一个特别特别重要的 bin 目录, 这个目录下存放着许多可执行文件。
其他系统中的可执行文件与此的类似。 这些可执行文件都是与服务器程序和客户端程序相关的。如果不知道对应的目录,比如在docker容器当中,可以通过查找mysqldump的方式查找目录。
root@a5f0ba6ab874:/usr/sbin# whereis mysqldump mysqldump: /usr/bin/mysqldump root@a5f0ba6ab874:/usr/sbin# cd /usr/bin/ root@a5f0ba6ab874:/usr/bin# ls
启动 MySQL 服务器程序
在类 UNIX 系统中用来启动 MySOL 服务器程序的可执行文件有很多, 大多在MySQL 安装目录的 bin 目录下。
mysqld
mysqld 这个可执行文件就代表着 MySOL 服务器程序, 运行这个可执行文件
就可以直接启动一个服务器进程。 但这个命令不常用。
mysqld_safe
mysqld safe 是一个启动脚本, 它会间接的调用 mysqld, 而且还顺便启动了另外一个监控进程, 这个监控进程在服务器进程挂了的时候, 可以帮助重启它。另外,使用 mysqld_safe 启动服务器程序时, 它会将服务器程序的出错信息和其他诊断信息重定向到某个文件中, 产生出错日志, 这样可以方便我们找出发生错误的原因。
mysql.server
mysql.server 也是一个启动脚本, 它会间接的调用 mysqld_safe, 在调用mysql.server 时在后边指定 start 参数就可以启动服务器程序了
就像这样:
mysql.server start
需要注意的是, 这个 mysql.server 文件其实是一个链接文件, 它的实际文件是 support-files/mysql.server, 所以如果在 bin 目录找不到, 到 support-files 下去找找, 而且如果你愿意的话, 自行用 ln 命令在 bin 创建一个链接。
另外, 我们还可以使用 mysql.server 命令来关闭正在运行的服务器程序, 只要把 start 参数换成 stop 就好了:
mysql.server stop
mysqld_multi
其实我们一台计算机上也可以运行多个服务器实例, 也就是运行多个 NySQL服务器进程。 mysql_multi 可执行文件可以对每一个服务器进程的启动或停止进行监控。
客户端程序
在我们成功启动 MySQL 服务器程序后, 就可以接着启动客户端程序来连接到这个服务器喽, bin 目录下有许多客户端程序, 比方说 mysqladmin、 mysqldump、mysqlcheck 等等。
我们常用的是可执行文件 mysql, 通过这个可执行文件可以让我们和服务器程序进程交互, 也就是发送请求, 接收服务器的处理结果。
mysqladmin 执行管理操作的工具, 检查服务器配置、 当前运行状态, 创建、删除数据库、 设置新密码。
mysqldump 数据库逻辑备份程序。mysqlbackup 备份数据表、 整个数据库、 所有数据库, 一般来说 mysqldump备份、 mysql 还原。
启动选项和参数
1. 配置参数文件
当 MySQL 实例启动时, 数据库会先去读一个配置参数文件, 用来寻找数据库的各种文件所在位置以及指定某些初始化参数, 这些参数通常定义了某种内存结构有多大等。 在默认情况下, MySQL 实例会按照-定的顺序在指定的位置进行读取, 用户只需通过命令 mysql --help|grep my.cnf 来寻找即可
root@a5f0ba6ab874:~# mysql --help|grep my.cnf order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf root@a5f0ba6ab874:~#
当然, 也可以在启动 MySQL 时, 指定配置文件:
bin/mysqld --defaults-file=/opt/mysql/mysql/etc/my.cnf --initialize --user=mysql
MySQL 数据库参数文件的作用和 Oracle 数据库的参数文件极其类似, 不同的是, Oracle 实例在启动时若找不到参数文件, 是不能进行装载(mount) 操作的。MySQL 稍微有所不同, MySQL 实例可以不需要参数文件, 这时所有的参数值取决于编译 MySQL 时指定的默认值和源代码中指定参数的默认值。MySQL 数据库的参数文件是以文本方式进行存储的。可以直接通过一些常用的文本编辑软件进行参数的修改。
2. 参数的查看和修改
可以通过命令 show variables 查看数据库中的所有参数, 也可以通过 LIKE 来过滤参数名, 前面查找数据库引擎时已经展示过了。 从 MySQL 5.1 版本开始, 还可以通过 information_schema 架构下的 GLOBAL_VARIABLES 视图来进行查找, 推
荐使用命令 show variables, 使用更为简单, 且各版本的 MySQL 数据库都支持。
参数的具体含义可以参考 MySQL 官方手册:
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html,但是课程中遇到的参数会进行讲解。
MySQL 数据库中的参数可以分为两类:动态(dynamic) 参数和静态(static) 参数。 动态参数意味着可以在 MySQL 实例运行中进行更改, 静态参数说明在整个实例生命周期内都不得进行更改, 就好像是只读(read only)的。
同时从作用范围又可以分为全局变量和会话变量。全局变量(GLOBAL) 影响服务器的整体操作。会话变量(SESSION/LOCAL) 影响某个客户端连接的操作。举个例子, 用 default_storage_engine 来说明, 在服务器启动时会初始化一个名为default_storage_engine, 作用范围为 GLOBAL 的系统变量。 之后每当有一个客户端连接到该服务器时, 服务器都会单独为该客户端分配一个名为default_storage_engine, 作用范围为 SESSION 的系统变量, 该作用范围为 SESSION的系统变量值按照当前作用范围为 GLOBAL 的同名系统变量值进行初始化。
可以通过 SET 命令对动态的参数值进行修改
SET 的语法如下:
SET l [global l session ] system_var_name= expr l [ @@global.l @@session.] system_var_name= expr 比如: SET read_ buffer_size=524288; SET @@global.read_ buffer_size=524288;
MySQL 所有动态变量的可修改范围, 可以参考 MySQL 官方手册的 Dynamic System Variables 的相关内容:
https://dev.mysql.com/doc/refman/5.7/en/dynamic-system-variables.html
对于静态变量, 若对其进行修改, 会得到类似如下错误:
数据目录
我们知道像 InnoDB、 MyIASM 这样的存储引擎都是把表存储在磁盘上的, 而操作系统用来管理磁盘的那个东东又被称为文件系统, 所以用专业一点的话来表述就是:像 InnoDB、 MyISAM 这样的存储引擎都是把表存储在文件系统上的。 当我们想读取数据的时候, 这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写入数据的时候, 这些存储引擎会把这些数据又写回文件系统。
1. 确定 MySQL 中的数据目录
那说了半天, 到底 MySQL 把数据都存到哪个路径下呢?其实数据目录对应着一个系统变量 datadir, 我们在使用客户端与服务器建立连接之后查看这个系统
变量的值就可以了:
show variables like 'datadir';
mysql> show variables like '%datadir%'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | datadir | /var/lib/mysql/ | +---------------+-----------------+ 1 row in set (0.00 sec)
当然这个目录可以通过配置文件进行修改, 由我们自己进行指定。
2. 数据目录中放些什么?
MySOL 在运行过程中都会产生哪些数据呢?当然会包含我们创建的数据库、表、 视图和触发器等用户数据, 除了这些用户数据, 为了程序更好的运行, MySQL也会创建一些其他的额外数据
数据库在文件系统中的表示
每当我们使用 CREATE DATABASE 语句创建一个数据库的时候, 在文件系统上实际发生了什么呢?其实很简单, 每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹, 我们每当我们新建一个数据库时, MySQL 会帮我们做这两件事儿:
1. 在数据目录下创建一个和数据库名同名的子目录(或者说是文件夹)。
2. 在该与数据库名同名的子目录下创建一个名为 db.opt 的文件, 这个文件中包含了该数据库的各种属性, 比方说该数据库的字符集和比较规则是个啥。
比方说我们查看一下在我的计算机上当前有哪些数据库︰
可以看到在当前有 6 个数据库, 其中 sakila和world数据库是我们自定义的, 其余 4 个数据库是属于 MySQL 自带的系统数据库。 我们再看一下数据目录下的内容:
当然这个数据目录下的文件和子目录比较多, 但是如果仔细看的话,除了information_schema 这个系统数据库外, 其他的数据库在数居目录下都有对应的子目录。这个information_schema 比较特殊, 我们后面再讲它的作用。
表在文件系统中的表示
我们的数据其实都是以记录的形式插入到表中的, 每个表的信息其实可以分为两种:
- 表结构的定义
- 表中的数据
表结构就是该表的名称是啥, 表里边有多少列, 每个列的数据类型是啥, 有啥约束条件和索引, 用的是啥字符集和比较规则各种信息, 这些信息都体现在了我们的建表语句中了。 为了保存这些信息, InnoDB 和 MyIASM 这两种存储引擎都在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件,文件名是这样:表名.frm
比方说world数据库有三张表
而数据目录下对应目录world目录下的内容如下
那表中的数据存到什么文件中了呢?在这个问题上, 不同的存储引擎就产生了有所不同, 在上面的world数据库中,是存在ibd文件当中的。 下边我们分别看一下 InnoDB 和 MyISAM 是用什么文件来保存表中数据的。
lnnoDB 是如何存储表数据的
InnoDB 的数据会放在一个表空间或者文件空间(英文名: table space 或者 file space)的概念, 这个表空间是一个抽象的概念, 它可以对应文件系统上一个或多个真实文件〈不同表空间对应的文件数量可能不同)。 每一个表空间可以被划分为很多很多很多个页, 我们的表数据就存放在某个表空间下的某些页里。 表空间有好几种类型。
系统表空间(system tablespace)
这个所谓的系统表空间可以对应文件系统上一个或多个实际的文件, 默认情况下, InnoDB 会在数据目录下创建一个名为 ibdata1(在你的数据目录下找找看有木有)、 大小为 12M 的文件, 这个文件就是对应的系纳表空间在文件系统上的表示
这个文件是所谓的自扩展文件, 也就是当不够用的时候它会自己增加文件大小, 当然, 如果你想让系统表空间对应文件系统上多个实际文件, 或者仅仅觉得原来的 ibdata1 这个文件名难听, 那可以在 MySQL 启动时配置对应的文件路径以及它们的大小, 我们也可以把系统表空间对应的文件路径不配置到数据目录下,甚至可以配置到单独的磁盘分区上。
需要注意的一点是, 在一个 MySQL 服务器中, 系统表空间只有一份。 从MySQL5.5.7 到 MySQL5.6.6 之间的各个版本中, 我们表中的数据都会被默认存储到这个系统表空间。
独立表空间(file-per-table tablespace)
在 MySQL5.6.6 以及之后的版本中, InnoB 并不会默认的把各个表的数据存储到系统表空间中, 而是为每一个表建立一个独立表空间, 也就是说我们创建了多少个表, 就有多少个独立表空间。 使用独立表空间来存储表数据的话, 会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件, 文件名和表名相同, 只不过添加了一个.ibd 的扩展名而已, 所以完整的文件名称长这样:表名.ibd。 其中.ibd 文件就用来存储 test 表中的数据和索引。 当然我们也可以自己指定使用系统表空间还是独立表空间来存储数据, 这个功能由启动参数innodb_file_per_table 控制,
select @@innodb_file_per_table
比如说我们想刻意将表数据都存储到系统表空间时, 可以在启动 MySQL 服务器的时候这样配置:
[server] innodb_file_per_table=0
当 imodb_file_per table 的值为 0 时, 代表使用系统表空间;当 innodb_file pertable 的值为 1 时, 代表使用独立表空间。 不过 inmodb_file_per_table 参数只对
新建的表起作用, 对于已经分配了表空间的表并不起作用。
其他类型的表空间
随着 MySQL 的发展, 除了上述两种老牌表空间之外, 现在还新提出了一些不同类型的表空间, 比如通用表空间(general tablespace) ,undo 表空间(undotablespace)、 临时表空间〈temporary tablespace)等。
这篇关于MySQL 中的目录和文件的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-25如何部署MySQL集群资料:新手入门教程
- 2024-12-24MySQL集群部署资料:新手入门教程
- 2024-12-24MySQL集群资料详解:新手入门教程
- 2024-12-24MySQL集群部署入门教程
- 2024-12-24部署MySQL集群学习:新手入门教程
- 2024-12-24部署MySQL集群入门:一步一步搭建指南
- 2024-12-07MySQL读写分离入门:轻松掌握数据库读写分离技术
- 2024-12-07MySQL读写分离入门教程
- 2024-12-07MySQL分库分表入门详解
- 2024-12-07MySQL分库分表入门指南