MySQL系列之文件

2021年10月12日 194点热度 1人点赞 0条评论

构成MySQL数据库和InnoDB存储引擎表的各种类型的文件可以分为以下类型:

  • 参数文件:告诉MySQL实例启动的时候在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置;
  • 日志文件:用来记录MySQL实例对某种条件做出响应时写入的文件,如错误日志,二进制日志文件,慢查询日志文件,查询日志文件等;
  • socket文件:当用UNIX域套接字方式进行连接时需要的文件;
  • pid文件:MySQL实例的进程ID文件;
  • MySQL表结构文件:用来存放MySQL表结构定义文件;
  • 存储引擎文件:因为MySQL表存储引擎的关系,每个存储引擎都会有自己的文件来保存记录和索引等数据。

参数文件

当MySQL实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大。在默认情况下,MySQL实例会按照一定的顺序在指定的位置进行读取。

MySQL数据库的参数文件时以文本方式进行存储的。

MySQL数据库中的参数可以分为两类:

  • 动态参数
  • 静态参数

动态参数意味着可以在MySQL实例运行中进行更改,静态参数说明在整个实例生命周期内都不得进行更改。可以用命令SET对动态的参数值进行修改。

日志文件

日志文件记录了影响MySQL数据库的各种类型活动。MySQL数据库中常见的日志文件有:

  • 错误日志
  • 二进制日志
  • 慢查询日志
  • 查询日志
  1. 错误日志

错误日志对MySQL的启动、运行、关闭过程进行了记录。MySQL DBA在遇到问题时应该首先查看该文件以便定位问题。该文件不仅记录了所有的错误信息,也记录了一些警告信息或正确的信息。

  1. 慢查询日志

慢查询日志可以帮助DBA定位可能存在问题的SQL语句,从而进行SQL语句层面的优化。在默认情况下,慢查询日志并不启动,需要手动设置参数将其开启。

用户可以通过参数long_query_time来设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中。另一个与慢查询日志有关的参数是log_queries_not_using_indexes,如果运行的SQL语句没有使用索引,则MySQL数据库同样会将这条SQL语句记录到慢查询日志文件。用户还可以通过参数long_query_io将超过指定逻辑IO次数的SQL语句记录到slow log中。

慢查询日志实例:

# Time: 200310 13:30:57
# User@Host: root[root] @ localhost []  Id: 21528
# Query_time: 6.000164  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1583818257;
select sleep(6);
  1. 慢查询日志以#作为起始符。
  2. User@Host:表示用户 和 慢查询查询的ip地址。
  3. 如上所述,表示 root用户 localhost地址。
  4. Query_time: 表示SQL查询持续时间, 单位 (秒)。
  5. Lock_time: 表示获取锁的时间, 单位(秒)。
  6. Rows_sent: 表示发送给客户端的行数。
  7. Rows_examined: 表示:服务器层检查的行数。
  8. set timestamp :表示 慢SQL 记录时的时间戳。
  9. 其中 select sleep(6) 则表示慢SQL语句。
  1. 查询日志

查询日志记录了所有对MySQL数据库请求的信息,无论这些请求是否得到了正确的执行。

  1. 二进制日志

其中二进制日志文件记录了对数据库执行更改的所有操作,不包括SELECT和SHOW这两类操作。所以用户想要记录select和show这种类型的操作,可以使用查询日志。

二进制日志主要有以下几种作用:

  • 恢复: 某些数据的恢复需要二进制日志,例如,在一个数据库全备文件恢复后,用户可以通过二进制日志进行point-in-time的恢复;
  • 复制:原理与恢复类似,通过复制和执行二进制日志使一台远程的MySQL数据库与一台MySQL数据库进行实时同步;
  • 审计:用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。

二进制日志在默认情况下是没有开启的,需要手动指定参数来启动,可能会有人质疑,开启这个选项是否会对数据库对整体性能有所影响,根据MySQL官方手册中的测试表明,开启二进制日志会使性能下降百分之一,但考虑到可以使用复制和point-in-time的恢复,这些性能的损失是可以忽略不计的。

套接字文件

在UNIX系统下本地连接MySQL可以采用UNIX域套接字方式,这种方式需要一个套接字文件。

pid文件

当MySQL实例启动时,会将自己的进程ID写入一个文件中——这个文件就是pid文件。

表结构定义文件

因为MySQL插件式存储引擎的体系结构的关系,MySQL数据的存储时根据表进行的,每个表都会有与之对应的文件。

InnoDB存储引擎文件

与InnoDB存储引擎密切相关的文件有重做日志文件和表空间文件。

表空间文件

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

用户可以把多个文件组成一个表空间,同时定制文件的属性。若这两个文件位于不同的磁盘上,磁盘的负载可能被平均,因此可以提高数据库的整体性能。还可以通过参数innodb_file_per_table=ON来产生每个表的单独的表空间文件,需要注意的是,这些单独的表空间文件仅存储该表的数据,索引和插入缓冲bitmap等信息。

重做日志文件

在默认情况下,在Innodb存储引擎的数据目录下会有两个名为ib_logfile0和ib_logfile1的文件。在MySQL官方手册中将其称为Innodb存储引擎的日志文件,但准确的定义应该是重做日志文件。重做日志文件对于Innodb存储引擎至关重要,他们记录了对于Innodb存储引擎的事务日志

当实例或介质失败时,重做日志就能派上用场。例如,数据库由于所在主机断电导致实例失败,Innodb存储引擎会使用重做日志恢复到掉电前的时刻,以此来保证数据的完整性。

每个Innodb存储引擎至少有一个重做日志文件组,每个文件组下至少有2个重做日志文件,为了得到更高的可靠性,用户可以设置多个镜像日志组,将不同的文件组放在不同的磁盘上,以此提高重做日志的高可用性。

重做日志文件的大小设置对于Innodb存储引擎的性能有着非常大的影响。一方面,重做日志文件不能设置得太大,如果设置的太大, 在恢复时可能需要很长的时间,另一方面又不能设置的太小,否则可能导致一个事务的日志需要多次切换重做日志文件,此外,重做日志文件太少会导致频繁的发生async checkpoint,导致性能的抖动。

重做日志文件有一个capacity变量,这个变量代表了最后的检查点不能超过这个阈值,如果超过则必须将缓冲池中脏页列表中的部分脏数据写回磁盘,这会导致用户线程的阻塞。

既然同样是记录事务日志,和之前的二进制有什么区别呢?

首先,二进制日志会记录所有与MySQL数据库有关的日志记录,包括Innodb,MyISAM等其他存储引擎的日志。而Innodb存储引擎的重做日志只记录有关该存储引擎本身的事务日志。

其次,二进制日志文件无论是什么格式,其记录的都是关于一个事务的具体操作内容,即该日志是逻辑日志,而Innodb存储引擎的重做日志文件记录的是关于每个页的更改的物理情况。

此外,写入的时间也不同,二进制日志文件仅在事务提交前进行提交,即只写磁盘一次,不论这时该事务有多大。而在事务进行的过程中,却不断的有重做日志条目被写入到重做日志文件中。

在前面也已经提到过,写入重做日志文件的操作不是直接写,而是先写入一个重做日志缓冲中,然后按照一定的条件顺序地写入日志文件。

从重做日志缓冲往磁盘写入时,是按512字节,也就是一个扇区的大小进行写入的,因为扇区是写入的最小单位,因此可以保证写入必定是成功的。因此在重做日志的写入过程中不需要有doublewrite。

agedcat_xuanzai

这个人很懒,什么都没留下

文章评论