MySQL与InnoDB相关文件

本章将会分析构成MySQL数据库和InnoDB存储引擎的各种类型文件,这些文件有如下几种:
参数文件:主要是保存了MySQL数据库相关参数的文件,比如指定存放数据库路径、初始化参数、内存大小等的配置。
日志文件:包括错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件等。
socket文件:当用unix域套接字方式进行连接时需要的文件。
pid文件:MySQL实例的进程pid文件。
MySQL表结构文件:用来存放MySQL表结构定义文件。
存储引擎文件:MySQL里面每个存储引擎都会有自己的文件来保存各种数据,记录了对应的数据记录和索引数据等。

一、参数文件
MySQL参数文件主要是my.cnf文件,里面保存了各种配置参数,除了配置文件之外,还可以连接到数据库使用sql语句对参数进行查询或者设置,这里推荐使用 show variables语句,返回内容太多如果需要过滤的可以使用 like ‘%关键字%’,如下图所示:

在这里插入图片描述

查询包含 buffer 关键字的参数信息,比如 innodb_buffer_pool_size 这个参数就是InnoDB引擎设置内存池大小的。

MySQL数据库中的参数可以分为两类:动态(dynamic)参数 和 静态(static)参数。动态参数意味着在MySQL运行中可以更改的,静态参数则是在运行中不可修改的。

对应动态参数,可以使用 set 语句进行修改,具体语法如下所示:

set
|[global|session] system_var_name = expr
|[@@global.|@@session.|@@]system_var_name = expr

其中 global 代表的是全局,session代表只针对当前连接回话。

二、日志文件
错误日志(error log)

错误日志这个很好理解,就是记录了MySQL的相关运行错误日志,运行 show variables like ‘log_error’ 语句可以看到错误日志文件路径,通常情况下是/var/log/mysql/error.log

慢查询日志(slow query log)

慢查询日志,记录的是那些执行时间过长的sql语句,long_query_time 参数用于设定慢查询的阀值时间,默认是10.000000,代表10秒,具体用户可以根据自身需求设置。执行语句 show variables like ‘%slow%’; 可以查看慢查询的相关设置,比如慢查询的日志文件路径等,如下图示

在这里插入图片描述

除了记录执行时间过长的sql语句之外,MySQL还提供了记录未使用索引的sql语句,具体参数是 log_queries_not_using_indexes,同样也是记录到慢查询日志文件里面。MySQL 5.6.5版本之后还提供了 log_throttle_queries_not_using_indexes 参数,用于防止过多地刷没使用索引的sql语句把慢查询日志文件撑大。

从MySQL 5.1开始,可以将慢查询日志记录保存在数据表格中,慢查询表在mysql数据库下,名叫slow_log,参数log_ouput指定了输出的目标,默认为FILE,可以将它设置为TABLE,就可以写入数据库表格了。

查询日志(log)
查询日志记录了所有对MySQL数据库请求的信息,默认情况下查询日志是没有开启的,具体可以通过 show variables like ‘%general_log%’ 语句查询,如下图示

在这里插入图片描述
查询日志跟慢查询日志一样,都是可以通过log_output参数指定保存到数据库表格,表格名称是general_log。

二进制日志(bin log)
二进制日志记录了对数据库执行了更改的所有操作,不包括类似select、show不会对数据产生变更的操作记录。但是对于会产生数据变更的如update等指令,就算最终没有对数据进行更改也一样会记录到bin log里面。

设计bin log主要有以下几个作用:
恢复:因为bin log记录的是所有数据记录的更改操作流水信息,所以可以通过bin log日志会恢复数据。
复制:复制跟恢复原理类似,主要是用于在搭建备机或者集群需要用到,用作将数据同步到其他节点。
审计:管理员可以通过bin log做信息审计,判断是否有被注入篡改数据的行为。

通过配置文件my.cnf参数log-bin[=name]可以启动bin log,默认情况下是不开启的,其中name是可选项,用于标记bin log的文件名,如果不指定则用主机名。通常情况下,bin log保存在数据库数据目录 datadir 路径,一般是/var/lib/mysql/,文件名格式是 [name|hostname]-bin.xxxxx,其中xxxxx是序列号,还有一个叫[name|hostname]-bin.index的bin log索引文件,用来保存产生的bin log序列号。

下面几个参数会对bin log行为有影响:

max_binlog_size 指定单个bin log文件最大值

binlog_cache_size 当使用事务引擎时,所有未提交(commit)的bin log会被记录到缓冲区,等待事务提交时直接将缓冲区的bin log写入bin log文件,该缓冲区大小则为该参数所指定。需要注意的是,这个参数是基于会话(session)的。

sync_binlog 默认情况下,bin log不是每次写都马上同步到磁盘去,这样就会存在当bin log还没刷到磁盘就宕机导致bin log数据丢失。该参数则是用于设置写bin log缓冲区多少次就同步到磁盘,sync_binlog=1则代表每次都写入磁盘,就相当于同步

binlog-do-db 标记需要写入bin log的数据库,默认为空,则代表所有数据库都需要同步bin log。

binlog-ignore-db 跟上面的binlog-do-db相反,指定那些数据库不需要同步bin log。

log-slave-update 如果当前服务器是复制中的slave角色,那么它不会降从master取得并执行的bin log日志写入自己的bin log文件。如果需要写入,则需要设置该参数,通常是搭建 master -> slave -> slave 架构需要。

binlog_format 该参数可以设置的值有 STATEMENT、ROW、MIXED。
STATEMENT代表bin log记录的是sql语句(这种方式有缺陷,比如记录的是函数语句,如rand、uuid这些在不同服务器上执行返回结果都不一样,会导致数据的不一致性);

ROW记录的是行更改情况,因为记录的是行数据的修改,所以可以很好地解决上面STATEMENT的缺陷(某些情况下,ROW也有不好的地方,比如一些批量的sql语句,如果使用STATEMENT的方式,同步记录的只有一条语句,但是基于ROW的就可能包含了大量的行记录变更信息);

MIXED则代表默认情况下使用STATEMENT记录,但在某些情况下使用ROW格式记录,比如使用一些执行结果跟当前运行服务器有关的,好像之前说的uuid,rand等。
binlog-format是动态参数,可以在运行中修改。bin log文件记录的是二进制数据,不便于观察,但是MySQL提供了一个叫 mysqlbinlog的工具可以翻译bin log日志内容。

三、pid文件
当MySQL实例启动时,会将自己的进程id写入一个文件中,该文件即为pid文件,具体如下图所示

在这里插入图片描述
四、结构文件
不同的存储引擎会有不同的文件,但是MySQL都会有一个 表名.frm 的文件,这个文件记录了该表名的结构定义,下面介绍跟InnoDB相关的文件。

表空间文件
InnoDB采用将存储的数据按表空间(tablespace)进行存放的设计。在默认配置下会有一个初始化大小为10MB,名为ibdata1的文件,该文件就是默认的表空间。可以通过设置 innodb_data_file_path 参数来指定多个文件来组成表空间,比如可以把多个文件分布在不同的磁盘,以提升数据库性能等。

用户可以使用 innodb_file_per_table 参数设定每个基于InnoDB的表都对应一个独立的存放空间,表名.idb。需要注意的是,就算设置了 innodb_file_per_table,这些单独的表空间文件只保存了该表的数据、索引和插入缓冲BITMAP等信息,其余信息还是存放在默认的表空间中。

重做日志文件
在默认情况下,InnoDB引擎会有两个名为ib_logfile0、ib_logfile1的文件,这两个就是重做日志文件(redo log),记录的是事务日志。每个InnoDB引擎至少有一个重做日志文件组(group),每个文件组下面至少有2个日志文件,默认是ib_logfile0,ib_logfile1,在日志组中每个重做日志文件的大小都是一致的,并以循环写入的方式运行。

下面列出几个跟重做日志有关的参数:
innodb_log_file_size:指定每个重做日志文件最大值
innodb_log_files_in_group:指定每个文件组内日志文件的个数,默认是2个
innodb_log_group_home_dir:指定日志文件在MySQL数据目录的目录名,默认是./

重做日志与二进制日志的区别
首先,二进制日志记录的是所有与MySQL数据库有关的日志记录,包括InnoDB、MyISAM、Heap等其他引擎的日志;而重做日志只记录InnoDB引擎有关的事务日志。
其次,记录的内容不同,二进制记录的是事务具体的操作内容;而重做日志记录的是每个页的更改的物理情况。
此外,写入时间也不同,二进制日志仅在事务提交前进行提交,即只写磁盘一次,无论这时该事务多大;而事务进行过程中,却不断有重做日志条目被写入日志文件中。

之前也说过,重做日志不会直接写入磁盘,而是先写入重做日志缓冲(redo log buffer),然后按照一定的条件顺序地写入日志文件。重做日志写入磁盘时,是按512个字节也就是一个扇区进行写入,因为扇区是写入的最小单位,可以保证写入要么是成功的,要么是失败不会出现部分写入的情况。
至于写入的条件则是由 innodb_flush_log_at_trx_commit 控制,有效值是0,1,2,默认是1。
0 代表提交事务时,并不将事务的重做日志写入磁盘上的日志文件,而是等待主线程每秒的刷新;
1 代表在执行commit事务提交时,把重做日志缓冲同步写入磁盘;
2 代表在执行commit事务提交时,把重做日志异步写到磁盘,即写到文件系统缓存中,不能完全保证能够最终写入磁盘。

想要获得更多技术干货,欢迎关注睿江云计算公众号。睿江云充一送一充送活动火热进行中~
在这里插入图片描述
点击链接查看优惠:http://www.eflycloud.com/#/home?from=RJ0027&salesID=XKKHRTRBK

猜你喜欢

转载自blog.csdn.net/RJ0024/article/details/83820578