MySql 中包含下面几种文件:

  • 参数文件:用于定义启动的初始化参数
  • 日志文件:用于记录MySql运行过程的日志,包括错误日志,二进制日志,慢查询日志和查询日志文件
  • socket文件:当用UNIX域套接字方式进行连接时需要的文件
  • pid文件:MySql实例进程的ID文件
  • 表结构文件:用于存放表结构定义的文件
  • 存储引擎文件:因为MySql中是存储引擎来保存数据的,所以针对不同的存储引擎有不同的存储文件

一、参数文件

  MySql在编译的时候指定了默认值以及源代码中的默认值,如果我们不做调整和特殊指定,在启动MySql实例的时候就按照默认的参数启动。

  在MySql中存在两类参数:动态参数 和 静态参数。动态参数意味着可以在MySql实例运行中进行更改,静态参数在整个实例生命周期内不能进行修改。

  我们可以通过show variables like 的方式查询系统中的参数。

  set @@gloable.systemParam = somevalue , 可以设置全局的系统参数,这样设置的参数在实例的整个生命周期内都会生效,但是如果实例关掉之后再启动

  通过这种方式设置的全局参数就失效了,所以如果想要永久的改变某些参数,最好还是通过配置文件的方式。

  还有就是通过这种方式更改的全局参数,但是对于当前的会话还是修改之前的值,只有退出当前的会话再连接的时候,才能看到修改之后的全局变量的值,这个要特别注意。

二、日志文件

  • 错误日志

     在MySql实例运行的过程中出现了任何问题,都应该第一个来查看错误日志。

     可以通过:show variables like 'log_error'\G ; 来查看当前实例的错误日志存放的位置

  • 慢查询日志

     慢查询日志可以帮助我们统计分析哪些SQL执行的过慢,然后可以进行优化来提高使用效率的

     在MySql 中可以通过:long_query_time 来设置慢查看阈值,只要执行时间超过这个阈值的查询都会被记录到慢查询日志中

     但是这里要注意的是,这个阈值不包括等于的情况,查询时间等于参数的查询不会被记录到慢查询日志中

     这个时间阈值在MySql 5.1开始但是为微秒,之前是只用秒来做单位的

     在MySql中默认是不启动慢查询日志的,我们可以通过查看参数:long_slow_queries 来调整

     在慢查询日志中还有一个有趣的参数:log_queries_not_using_index,如果开启了这个配置,那么所有没有使用索引的查询也都会被记录到慢查询日志中

     但是因为这个没有使用索引的查询可能会非常多,所以在MySql 5.6.5版本开始又增加了一个参数:log_throttle_queries_not_using_index,表示每分钟允许被记录到

     慢查询中未使用索引的SQL次数,默认值是0 表示没有限制。

     这个慢查询日志随着实例运行时间的推移可能会非常的大,那这时我们可以通过:mysqldumps -s al -n 10 <logName>

     从MySql 5.1开始可以将慢查询日志存放到一张表中,这样查询起来更加的方便,默认表名为:slow_log

     这里也可以通过查看参数:log_output 来查看慢查询日志的输出,默认是FILE,可以将其设置为TABLE,然后就可以通过slow_log表来进行查询了

     如果是采用文件的方式存储,我们可以通过参数:slow_query_log_file 来查看具体存储的位置。

  • 查询日志

     所有MySql的查询都会被记录下来,有一些类似Nginx的access log 一样,无论这个请求是否被正确的执行了。

       这个日志在MySql中保存在general_log中,与慢查询中的slow_log是一样的,很多内容都可以参照慢查询日志。

  • 二进制日志

       所有的对数据库进行修改的操作,都会被记录到二进制日志中,二进制日志主要有以下三种作用:

  1. 恢复:某些数据的恢复需要二进制日志,例如,在一个数据库全备份文件恢复后,可以通过二进制进行point-in-time的恢复
  2. 复制:原理与恢复一致,只是复制使用的是一台远程的MySql实例,Master - Slave 就是通过二进制日志进行同步的
  3. 审计:可以通过对二进制日志中的内容进行分析,可以判断是否有对数据库的攻击

     我们可以通过命令查看参数:datadir 来找到当前实例的二进制日志的保存路径,二进制日志默认情况下是不会开启的,我们可以调整参数:log_bin来选择是否开启

     MySql中有很多关于二进制日志的参数,下面通过表格来梳理一下:

参数

作用

max_binlog_size

用于指定二进制日志文件的最大值,如果超过该值,则创建新的二进制文件。后缀+1,并且记录到binlog.index文件中

binlog_cache_size

对于事务型的存储引擎,所有未提交的二进制日志会被记录到一个缓存中,等该事务提交时直接将缓冲区的二进制日志写入到二进制日志文件,该缓冲区的大小由这个参数控制,默认大小是32K。这个参数是基于会话的,也就是说当一个线程开启一个事务就会分配一个缓冲区,因此一定要注意这个值不能设置的太大。但是如果在一个事务中如果产生的二进制日志超过了这缓冲区的大小,再产生的二进制日志会被记录到一个临时文件中。我们可以查看参数:binlog_cache_use(使用缓冲写二进制日志的次数)和binlog_cache_disk_use(使用临时文件写二进制日志的次数)来查看binlog_cache的使用情况,用于判断binlog_cache_size是否设置的合理。

sync_binlog

表示每写多少次缓冲就同步到磁盘,默认值是0

binlog-do-db

表示需要写入或者忽略哪些库的日志,默认为空,表示需要同步所有库的日志到二进制日志文件。

binlog-igonre-db

log-slave-update

在MySql的主从架构中,是通过binlog来同步数据的,slave在接受了master的二进制日志执行后,默认是不需要将操作写入到自己的二进制日志文件中,通过这个参数可以控制slave是否要记录自己的二进制日志

binlog_format

十分重要的一个参数。这个参数是在MySql 5.1开始出现的,在没有这个参数之前,所有的二进制日志都是基于SQL的,也就是Statement级别的,但是在主从结构中,如果在主中,这个SQL运行了rand、uuid等函数,或者是触发了触发器,那么就会导致主从的数据不一致。所以才出现了这个配置,可选配置的值有:Statement,row和mixed。

  1. statement:表示记录的二进制文件都是逻辑的SQL
  2. row:记录表的行更改情况,这种格式需要更大的磁盘空间
  3. mixed:在该模式写,默认采用SQL的方式进行记录,然后在一些特殊情况下采用row的方式进行记录

 

三、套接字文件

  在UNIX系统下本地连接MySql可以采用UNIX套接字的方式,这中方式需要一个套接字文件,套接字文件可以由参数socket控制,一般在/tmp目录下,名为mysql.sock

四、pid文件

  在数据库实例启动的时候会将当前的进行写入到一个文件中,默认路径是数据库的目录下

五、表结构定义文件

  MySql是通过存储引擎进行表存储的,所以每个表都是一个对应的数据文件,但是无论用哪种存储引擎,MySql都会由一个frm为后缀的文件,这个文件记录了该表的表结构定义

  frm文件还用来存放视图的定义

六、InnoDB存储引擎文件

  • 表空间文件

    InnoDB采用将存储的数据按照表空间进行存放的设计,在默认配置下会有一个初始大小为10MB,名为:ibdata1的文件,该文件就是默认的表空间文件

    我们可以通过参数:innodb_data_file_path来进行设置,设置了这个参数之后,所有的InnoDB的表的数据都会存储到该共享表空间中

    我们也可以设置参数:innodb_file_per_table,这样可以将每个基于InnoDB存储引擎的表产生一个单独的表空间,独立的表空间命名为:表名.ibd

    但是有一点需要注意,使用了每个表单独的表空间之后,这些独立的表空间只存储该表的数据,索引和插入缓冲BITMAP等信息,其余的信息还是存放在共享表空间中

  • 重做日志文件

     我们常称为redo log,主要是在数据库出现异常宕机的时候,用来恢复数据使用的。

    这里要说明一下重做日志文件和上面说的二进制文件的区别:

    一、二进制日志会记录下所有与MySql数据库有关的日志记录,包括InnoDB,MyISAM等等,但是重做日志文件只记录InnoDB本身的事务日志

    二、记录的内容不同,因为无论我们binlog_format设置为什么,其实记录的都是关于一个事务的集体操作的内容,即是一种逻辑日志,但是重做日志是关于物理存储的每个

      页的变更情况,比如在哪个页上偏移量为800的地方做什么修改,与binlog相比更像是一种物理日志。

    三、写入的时间不同,二进制日志文件仅在事务提交前进行提交,即只写磁盘一次,无论这个事务有多大,而在事务进行中,却不断的产生重做日志被写入到重做日志文件中

    在上一篇文章中我们有介绍过,这个写重做日志不是直接写到磁盘上的,而是先写到一个叫做redo log buffer中,然后按照一定的条件顺序写入到日志文件中,从重做日志

    缓冲往磁盘里写入时,是按照512个字节,也就是一个扇区的大小进行写入,因为扇区是最小的写入单位,这样可以确保写入成功,所以在重做日志的写入过程中不需要进行

    doublewrite(doublewrite是记录到共享表空间里面的,可以结合上面的知识联系起来)。