1.2. MySQL 中的目录和文件
1.2.1. bin 目录
在 MysQL 的安装目录下有一个特别特别重要的 bin 目录,这个目录下存放着 许多可执行文件。
其他系统中的可执行文件与此的类似。这些可执行文件都是与服务器程序和 客户端程序相关的。
1.2.1.1. 启动 MySQL 服务器程序
在类 UNIX 系统中用来启动 MySOL 服务器程序的可执行文件有很多,大多在 MNySQL 安装目录的 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 可执行文件可以对每一个服务器进程的启动或停止进 行监控。
1.2.1.2. 客户端程序
在我们成功启动 MysTL 服务器程序后,就可以接着启动客户端程序来连接到 这个服务器喽, bin 目录下有许多客户端程序,比方说 mysqladmin、mysqldump、 mysqlcheck 等等。
我们常用的是可执行文件 mysql,通过这个可执行文件可以让我们和服务器 程序进程交互,也就是发送请求,接收服务器的处理结果。
mysqladmin 执行管理操作的工具,检查服务器配置、当前运行状态,创建、 删除数据库、设置新密码。
mysqldump 数据库逻辑备份程序。
mysqlbackup 备份数据表、整个数据库、所有数据库,一般来说 mysqldump 备份、mysql 还原。
1.2.2. 启动选项和参数
1.2.2.1. 配置参数文件
当 MySQL 实例启动时,数据库会先去读一个配置参数文件,用来寻找数据 库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存 结构有多大等。在默认情况下,MySQL 实例会按照-定的顺序在指定的位置进行 读取,用户只需通过命令 mysql –help|grep my.cnf 来寻找即可。
当然,也可以在启动 MySQL 时,指定配置文件:
这个时候,就会以启动时指定的配置文件为准。
MySQL 数据库参数文件的作用和 Oracle 数据库的参数文件极其类似,不同 的是,Oracle 实例在启动时若找不到参数文件,是不能进行装载(mount)操作的。 MySQL 稍微有所不同,MySQL 实例可以不需要参数文件,这时所有的参数值取 决于编译 MySQL 时指定的默认值和源代码中指定参数的默认值。
MySQL 数据库的参数文件是以文本方式进行存储的。可以直接通过一些常用 的文本编辑软件进行参数的修改。
1.2.2.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
对于静态变量,若对其进行修改,会得到类似如下错误
1.2.3. 数据目录
我们知道像 InnoDB、MyIASM 这样的存储引擎都是把表存储在磁盘上的,而 操作系统用来管理磁盘的那个东东又被称为文件系统,所以用专业一点的话来表 述就是:像 InnoDB、MyISAM 这样的存储引擎都是把表存储在文件系统上的。当 我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们, 当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。
1.2.3.1. 确定 MySQL 中的数据目录
那说了半天,到底 MySQL 把数据都存到哪个路径下呢?其实数据目录对应着 一个系统变量 datadir,我们在使用客户端与服务器建立连接之后查看这个系统 变量的值就可以了:
show variables like ‘datadir’;
当然这个目录可以通过配置文件进行修改,由我们自己进行指定。
1.2.3.2. 数据目录中放些什么?
MySOL 在运行过程中都会产生哪些数据呢?当然会包含我们创建的数据库、 表、视图和触发器等用户数据,除了这些用户数据,为了程序更好的运行,MySQL 也会创建一些其他的额外数据
数据库在文件系统中的表示
每当我们使用 CREATE DATABASE 语句创建一个数据库的时候,在文件系统 上实际发生了什么呢?其实很简单,每个数据库都对应数据目录下的一个子目录, 或者说对应一个文件夹,我们每当我们新建一个数据库时,MySQL 会帮我们做这 两件事儿:
1.在数据目录下创建一个和数据库名同名的子目录(或者说是文件夹)。
2.在该与数据库名同名的子目录下创建一个名为 db.opt 的文件,这个文件 中包含了该数据库的各种属性,比方说该数据库的字符集和比较规则是个啥。
比方说我们查看一下在我的计算机上当前有哪些数据库︰
可以看到在当前有 5 个数据库,其中 mysqladv 数据库是我们自定义的,其 余 4 个数据库是属于 MySQL 自带的系统数据库。我们再看一下数据目录下的内容:
当然这个数据目录下的文件和子目录比较多,但是如果仔细看的话,除了 information_schema 这个系统数据库外,其他的数据库在数居目录下都有对应的 子目录。这个 information_schema 比较特殊,我们后面再讲它的作用。
表在文件系统中的表示
我们的数据其实都是以记录的形式插入到表中的,每个表的信息其实可以分 为两种:
1.表结构的定义
2.表中的数据
表结构就是该表的名称是啥,表里边有多少列,每个列的数据类型是啥,有 啥约束条件和索引,用的是啥字符集和比较规则各种信息,这些信息都体现在了 我们的建表语句中了。为了保存这些信息,InnoDB 和 MyIASM 这两种存储引擎 都在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件, 文件名是这样:表名.frm
比方说我们在 mysqladv 数据库下创建一个名为 test 的表:
那在数据库 mysqladv 对应的子目录下就会创建一个名为 test.frm 的用于描 述表结构的文件。这个后缀名为.fm 是以二进制格式存储的。
那表中的数据存到什么文件中了呢?在这个问题上,不同的存储引擎就产生 了有所不同,下边我们分别看一下 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。
比方说假如我们使用了独立表空间去存储 xiaohaizi 数据库下的 test 表的话, 那么在该表所在数据库对应的 xiaohaizi 目录下会为 test 表创建这两个文件:
test.frm 和 test.ibd
其中 test.ibd 文件就用来存储 test 表中的数据和索引。当然我们也可以自己 指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数
innodb_file_per_table 控制,比如说我们想刻意将表数据都存储到系统表空 间时,可以在启动 MySQL 服务器的时候这样配置:
[server]
innodb_file_per_table=0
当 imodb_file_per table 的值为 0 时,代表使用系统表空间;当 innodb_file per table 的值为 1 时,代表使用独立表空间。不过 inmodb_file_per_table 参数只对 新建的表起作用,对于已经分配了表空间的表并不起作用。
其他类型的表空间
随着 MySQL 的发展,除了上述两种老牌表空间之外,现在还新提出了一些 不同类型的表空间,比如通用表空间(general tablespace) ,undo 表空间 (undotablespace)、临时表空间〈temporary tablespace)等。
MyISAM 是如何存储表数据的
在 MyISAM 中的数据和索引是分开存放的。所以在文件系统中也是使用不同 的文件来存储数据文件和索引文件。而且和 InnoDB 不同的是,MyISA 并没有什 么所谓的表空间一说,表数据都存放到对应的数据库子目录下。
test_myisam 表使用 MyISAM 存储引擎的话,那么在它所在数据库对应的 xieotaizi 目录下会为 myisam 表创建三个文件:
其中 test_myisam.MYD 代表表的数据文件,也就是我们插入的用户记录; test_myisam.MYI 代表表的索引文件,我们为该表创建的索引都会放到这个文件 中。
1.2.3.3. 日志文件
在服务器运行过程中,会产生各种各样的日志,比如常规的查询日志、错误 日志、二进制日志、redo 日志、Undo 日志等等,日志文件记录了影响 MySQL 数据库的各种类型活动。
常见的日志文件有:错误日志(error log)、慢查询日志(slow query log)、 查询日志(query log)、二进制文件(bin log)。
错误日志
错误日志文件对 MySQL 的启动、运行、关闭过程进行了记录。遇到问题时 应该首先查看该文件以便定位问题。该文件不仅记录了所有的错误信息,也记录 一些警告信息或正确的信息
用户可以通过下面命令来查看错误日志文件的位置:
show variables like ‘log_error’\G;
当 MySQL 不能正常启动时,第一个必须查找的文件应该就是错误日志文件, 该文件记录了错误信息。
慢查询日志
慢查询日志可以帮助定位可能存在问题的 SQL 语句,从而进行 SQL 语句层面 的优化,具体的使用我们以后再说。
查询日志
查询日志记录了所有对 MySQL 数据库请求的信息,无论这些请求是否得到 了正确的执行。
默认文件名:主机名.log
从 MySQL 5.1 开始,可以将查询日志的记录放入 mysql 架构下的 general_log 表
二进制日志(binlog)
二进制日志记录了对 MySQL 数据库执行更改的所有操作,若操作本身没有 导致数据库发生变化,该操作可能也会写入二进制文件。但是不包括 select 和 show 这类操作(因为这些操作对数据本身不会进行修改)
二进制日志的几种作用:
恢复(recovery):某些数据的恢复需要二进制日志,例如,在一个数据库 全备文件恢复后,用户可以通过二进制文件进行 point-in-time 的恢复
复制(replication):其原理与恢复类似,通过复制和执行二进制日志使一 台远程的 MySQL 数据库(一般称为 slave 或 standby)与一台 MySQL 数据库(一 般称为 master 或 primary)进行实时同步
审计(audit):用户可以通过二进制日志中的信息来进行审计,判断是否有 对数据库进行注入的攻击
log-bin 参数
该参数用来控制是否开启二进制日志,默认为关闭
如果想要开启二进制日志的功能,可以在 MySQL 的配置文件中指定如下的 格式:
“name”为二进制日志文件的名称
如果不提供 name,那么数据库会使用默认的日志文件名(文件名为主机名, 后缀名为二进制日志的序列号),且文件保存在数据库所在的目录(datadir 下)
–启用/设置二进制日志文件(name 可省略)
log-bin=name;
配置以后,就会在数据目录下产生类似于:
bin_log.00001 即为二进制日志文件;bin_log.index 为二进制的索引文件,用 来存储过往产生的二进制日志序号,通常情况下,不建议手动修改这个文件。
二进制日志文件在默认情况下并没有启动,需要手动指定参数来启动。开启 这个选项会对 MySQL 的性能造成影响,但是性能损失十分有限。根据 MySQL 官 方手册中的测试指明,开启二进制日志会使性能下降 1%。
1.2.3.3. 其他的数据文件
除了我们上边说的这些用户自己存储的数据以外,数据文件下还包括为了更 好运行程序的一些额外文件,当然这些文件不一定会放在数据目录下,而且可以 在配置文件或者启动时另外指定存放目录。
主要包括这几种类型的文件:
- ·服务器进程文件。
我们知道每运行一个 MySQL 服务器程序,都意味着启动一个进程。MySQL 服务器会把自己的进程 ID 写入到一个 pid 文件中。
socket 文件
当用 UNIX 域套接字方式进行连接时需要的文件。
- 默认/自动生成的 SSL 和 RSA 证书和密钥文件。
–
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76892.html