目录
- bin 目录
- 服务器程序
- mysqld
- mysqld_safe
- mysql.server
- mysqld_multi
- 客户端程序
- mysqladmin
- mysqldump
- mysqlbackup
- 启动选项和参数
- 配置参数文件
- 参数的查看和修改
- 数据目录
- MySQL 中的数据目录
- 表在文件系统中的表示
- lnnoDB 是如何存储表数据的
- 系统表空间(system tablespace)
- 独立表空间(file-per-table tablespace)
- 其他类型的表空间
- MyISAM 是如何存储表数据的
- 日志文件
- 错误日志
- 慢查询日志
- 查询日志
- 二进制日志(binlog)
- 其他的数据文件
bin 目录
在 MysQL 的安装目录下有一个特别特别重要的 bin 目录,这个目录下存放着许多可执行文件
其他系统中的可执行文件与此的类似。这些可执行文件都是与服务器程序和客户端程序相关的
服务器程序
在类 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
其实我们一台计算机上也可以运行多个服务器实例,也就是运行多个 MySQL 服务器进程。mysql_multi 可执行文件可以对每一个服务器进程的启动或停止进行监控
客户端程序
成功启动 MySQL 服务器程序后,就可以接着启动客户端程序来连接到这个服务器,bin 目录下有许多客户端程序,比方说 mysqladmin、mysqldump、mysqlcheck 等等
我们常用的是可执行文件 mysql,通过这个可执行文件可以让我们和服务器程序进程交互,也就是发送请求,接收服务器的处理结果
mysqladmin
执行管理操作的工具,检查服务器配置、当前运行状态,创建、删除数据库、设置新密码
mysqldump
数据库逻辑备份程序
mysqlbackup
数据库物理备份程序
启动选项和参数
配置参数文件
当 MySQL 实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等。在默认情况下,MySQL 实例会按照一定的顺序在指定的位置进行读取,用户只需通过下面命令寻找即可:
mysql --help|grep my.cnf
当然,也可以在启动 MySQL 时,指定配置文件:
再次查看:
这个时候,就会以启动时指定的配置文件为准
MySQL 数据库参数文件的作用和 Oracle 数据库的参数文件极其类似,不同的是,Oracle 实例在启动时若找不到参数文件,是不能进行装载(mount)操作的。MySQL 稍微有所不同,MySQL 实例可以不需要参数文件,这时所有的参数值取决于编译 MySQL 时指定的默认值和源代码中指定参数的默认值
MySQL 数据库的参数文件是以文本方式进行存储的。可以直接通过一些常用的文本编辑软件进行参数的修改
参数的查看和修改
可以通过命令 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)影响某个客户端连接的操作
数据目录
像 InnoDB、MyISAM 这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统
MySQL 中的数据目录
数据目录对应着一个系统变量 datadir,我们在使用客户端与服务器建立连接之后查看这个系统变量的值就可以查看数据目录的地址,例如:
show variables like 'datadir';
当然这个目录可以通过配置文件进行修改,由我们自己进行指定
表在文件系统中的表示
数据其实都是以记录的形式插入到表中的,每个表的信息其实可以分为两种:
- 表结构的定义
- 表中的数据
表结构就是该表的名称是什么,表里边有多少列,每个列的数据类型是啥,有啥约束条件和索引,用的是啥字符集和比较规则各种信息,这些信息都体现在了建表语句中了。为了保存这些信息,InnoDB 和 MyIASM 这两种存储引擎都在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件,文件名是这样:表名.frm
例如:在 mysqladv 数据库下创建一个名为 test 的表:
数据目录下的文件:
那在数据库 mysqladv 对应的子目录下就会创建一个名为 test.frm 的用于描述表结构的文件。这个后缀名为.fm 是以二进制格式存储的
不同的存储引擎对数据的存储不太一样
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 表的话,那么在该表所在数据库对应的目录下会为 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 存储引擎的话,那么在它所在数据库对应的目录下会为 myisam 表创建三个文件:
- test_myisam.MYD 代表表的数据文件,也就是我们插入的用户记录;
- test_myisam.MYI 代表表的索引文件,我们为该表创建的索引都会放到这个文件中
日志文件
在服务器运行过程中,会产生各种各样的日志,比如常规的查询日志、错误日志、二进制日志、redo 日志、Undo 日志等等,日志文件记录了影响 MySQL 数据库的各种类型活动
常见的日志文件有:
- 错误日志(error log)
- 慢查询日志(slow query log)
- 查询日志(query log)
- 二进制文件(bin log)
错误日志
错误日志文件对 MySQL 的启动、运行、关闭过程进行了记录。遇到问题时应该首先查看该文件以便定位问题。该文件不仅记录了所有的错误信息,也记录一些警告信息或正确的信息
用户可以通过下面命令来查看错误日志文件的位置:
show variables like 'log_error'\G;
当 MySQL 不能正常启动时,第一个必须查找的文件应该就是错误日志文件,该文件记录了错误信息
慢查询日志
慢查询日志可以帮助定位可能存在问题的 SQL 语句,从而进行 SQL 语句层面的优化
默认文件名:主机名-slow.log
查询日志
查询日志记录了所有对 MySQL 数据库请求的信息,无论这些请求是否得到了正确的执行
默认文件名:主机名.log
从 MySQL 5.1 开始,可以将查询日志的记录放入 mysql 架构下的 general_log 表
二进制日志(binlog)
二进制日志记录了对 MySQL 数据库执行更改的所有操作,若操作本身没有导致数据库发生变化,该操作可能也会写入二进制文件。但是不包括 select 和 show 这类操作(因为这些操作对数据本身不会进行修改)
二进制日志的几种作用:
- 恢复(recovery):某些数据的恢复需要二进制日志,例如,在一个数据库全备文件恢复后,用户可以通过二进制文件进行 point-in-time 的恢复
- 复制(replication):其原理与恢复类似,通过复制和执行二进制日志使一台远程的 MySQL 数据库(一般称为 slave 或 standby)与一台 MySQL 数据库(一般称为 master 或 primary)进行实时同步
- 审计(audit):用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击
其他的数据文件
除了上边说的这些用户自己存储的数据以外,数据文件下还包括为了更好运行程序的一些额外文件,当然这些文件不一定会放在数据目录下,而且可以在配置文件或者启动时另外指定存放目录
主要包括这几种类型的文件:
- 服务器进程文件
每运行一个 MySQL 服务器程序,都意味着启动一个进程。MySQL 服务器会把自己的进程 ID 写入到一个 pid 文件中
socket 文件:当用 UNIX 域套接字方式进行连接时需要的文件
- 默认/自动生成的 SSL 和 RSA 证书和密钥文件