1,前言
MySQL数据库和InnoDB存储引擎有这样几种文件:
- 参数文件
- 日志文件
- socket文件
- pid文件
- MySQL表结构文件
- 存储引擎文件
2,文件
2.1,参数文件
2.1.1,参数文件的读取
当MySQL启动时,会去读取配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数。MySQL实例启动的时候也可以不需要参数文件,这时所有的参数值取决于编译MySQL时指定的默认值和源代码中指定参数的默认值。但是如果MySQL在默认的数据库目录中没有找到mysql架构的话,则会启动失败,mysql架构中记录了访问该实例权限的权限,若找不到,实例就不会启动成功。
2.1.2,参数类型
MySQL参数文件中的参数有两种:
- 静态参数
- 动态参数
- 基于会话:当前会话内有效,如autocommit
- 基于实例:整个MySQL实例生命周期内有效
静态参数表示在整个生命周期内都不得进行修改;而动态参数则可以在MySQL实例运行过程中进行修改。 值得一提的是,在实例中修改了参数,这个参数在这个实例运行期间都会生效,一旦实例重启,MySQL还是会按照参数文件里的参数进行设置。要想永久的修改某些设置,可以修改MySQL的参数文件。
2.2,日志文件
日志文件记录了MySQL数据库的各种类型活动
2.2.1,错误日志
错误日志对MySQL的启动、运行、关闭过程进行了记录。MySQL DBA在遇到问题时应该首先查看该文件。 可以通过查看参数:log_error来寻找错误日志的存放位置
show variables like 'log_error'
2.2.2,慢查询日志
慢查询日志能为SQL语句的优化带来很好的帮助。设置一个阈值,运行时间超过这个阈值的SQL语句都会被记录到这个文件。 MySQL默认不启动慢查询日志,所以需要手动修改参数:log_slow_queries,将其修改为ON
show variables like 'log_slow_queries';
SQL执行时间超过阈值(大于阈值才会被记录,小于或等于并不会被记录),就会被记录到慢查询日志,与这个阈值有关的参数是:long_query_time
show variables like 'long_query_time';
还可以将没有使用索引的SQL执行语句记录到慢查询日志,只需要设置参数:log_queries_not_using_indexes为ON
show variables like 'log_queries_not_using_indexes';
2.2.3,查询日志
查询日志记录了所有对MySQL数据库请求的信息,不论这些请求是否得到了正确的执行!
2.2.4,二进制日志
二进制日志记录了对数据库执行更改的所有操作,当然并不包括SELECT和SHOW这类的操作,因为这类命令并不会更改数据库。 二进制日志的主要作用有:
- 恢复(recovery):某些数据的恢复需要二进制日志,如当一个数据库全备文件恢复后,可以通过二进制文件进行point-in-time的恢复(恢复到某个时间点下的数据库状态)
- 复制(replication):原理与恢复类似,通过复制和执行二进制日志使得主从数据库间进行实时同步
二进制日志文件在默认情况下是没有启动的,需要手动指定参数来启动。开启这个功能会影响性能,但影响十分有限,在考虑可以使用复制和point-in-time恢复的情况下,这些性能损失是值得的
2.3,套接字文件
Unix系统下本地连接MySQL可以采用Unix域套接字方式,这种方式需要一个套接字文件。套接字文件可由参数socket控制。一般在/tmp目录下,名为mysql.sock
2.4,pid文件
当MySQL实例启动时,会将自己的进程ID写入一个文件中----即为pid文件,该文件可由参数pid_file控制,默认路径位于数据库目录下,文件名为:主机名.pid
2.5,表结构定义文件
因为MySQL插件式存储引擎的体系结构的关系,MySQL对于数据的存储是按照表的,并非按照存储引擎。无论是使用任何存储引擎,MySQL都有一个.frm后缀的文件,这个文件记录了该表的表结构定义(也可以记录视图的定义)
2.6,InnoDB存储引擎文件
上面介绍的文件都是MySQL数据库本身的文件,和存储引擎无关。除了这些文件外,每个表存储引擎都还有其自己独有的文件。
2.6.1,表空间文件
InnoDB存储引擎在存储设计上模仿了Oracle,将存储的数据按表空间进行存放。
可以这样简单粗暴的理解:
- 有一个表空间A,有这么一个表B
- 假设A是B的表空间
- 那么A下面会有表B的定义文件、表B的数据文件
2.6.2,重做日志文件
重做日志的主要目的是,万一实例或者介质失败,InnoDB存储引擎会使用重做日志恢复到断电前的时刻,以此来保证数据的完整性。 同样是记录事务日志,重做日志文件只记录InnoDB存储引擎本身的事务日志;而前文提到的二进制日志会记录所有与MySQL有关的日志记录,包括InnoDB、MyISAM、Heap等其他存储引擎的日志。
|