InnoDB存储引擎(二)文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kukubao207/article/details/88602042

一、概述

在这篇博客中我要整理MySQL数据库和InnoDB存储引擎的各种类型文件。

  • 参数文件:数据库启动时的数据文件位置、初始化参数、各种内存大小设置
  • 日志文件:错误日志、二进制日志、慢查询日志、查询日志
  • socket文件:套接字方式连接数据库时的文件
  • pid文件:数据库实例进程ID文件
  • MySQL表结构文件:存放MySQL表结构定义文件。
  • 存储引擎文件:存储了记录和索引等数据的文件。

二、参数文件

简单来看,可以把数据库参数看做是一个键值对(key/value),比如说innodb_buffer_pool_size=1G,这里的键是innodb_buffer_pool_size,值是1G。

  • Mysql启动时,读一个参数去定位数据库的文件
  • 某些初始化参数,定义了某个内存结构的大小

参数分为两种类型:

  • 动态参数:MySQL实例运行时可以修改
  • 静态参数:不可以修改,只读。

注意一下global和session关键字。
他们表明动态参数的修改是基于当前的会话还是整个实例的生命周期。

三、日志文件

3.1 错误日志

错误日志对MySQL的启动、运行、关闭过程进行了记录,所以如果我们在实践中发现数据库无法正常启动,就去查看错误日志文件。

3.2 慢查询日志

慢查询日志,顾名思义,就是查询比较慢的日志,就是SQL语句执行比较慢的语句,会被记录到该日志中,那么DBA可以通过慢查询日志可以得到一些关于数据库优化的信息,从而进行SQL语句层面的优化。我们可以设置一个阈值long_query_time,默认为10,代表10秒。那么运行时间超过这个阈值的SQL语句都会被记录到慢查询日志中。

3.3 二进制日志

二进制日志记录了对MySQL数据库执行更改的所有操作。Select和Show这类SQL不会被记录到二进制日志中,但如果是update,就算没有修改任何记录,也会被记录到二进制日志中。
二进制日志的三个作用:

  • 恢复:point-in-time恢复
  • 复制:主从数据库进行同步,复制二进制文件并执行
  • 审计:可以分析是否有数据库注入攻击的发生

实现机制:当使用事物的表存储引擎时,所有未提交的二进制日志会记录到一个缓存中去,等该事物提交的时候直接将缓存中的二进制日志刷到磁盘上,该缓冲的大小由binlog_cache_size决定,默认为32K。
参数sync_binlog=[N]表示每写缓存多少次就刷一次磁盘。sync_log=1表示每写一次缓存直接把缓存里的刷到磁盘。
特殊情况:当使用InnoDB存储引擎的时候,在一个事物Commit之前,由于sync_binlog为1,因此会将二进制日志立即写入磁盘。如果这时已经写入了二进制文件,Commit还没有发生,然后宕机了,那么下次MySQL启动时,事物会被回滚掉,但是二进制文件已经记录了数据,不能回滚。这个问题可以通过设置参数innodb_support_xa为1来解决。

参数binlog_format影响二进制文件日志的格式

  • STATEMENT:记录逻辑SQL语句
  • ROW:记录表的行更改情况(为数据库的恢复、主从复制提供可靠性,但磁盘开销会增大)
  • MIXED:前两者混合

四、套接字文件、pid文件、表结构定义文件

Unix系统下本地连接MySQL可以采用Unix域套接字方式,这种方式需要一个套接字文件。套接字文件由参数socket控制,一般在/tmp目录下。

MySQL实例启动时,会把自己的进程id写到一个pid文件中。

frm文件记录表、视图的表结构定义。

五、 InnoDB存储引擎文件

5.1 表空间文件

数据存储到表空间。
用户可以通过多个文件组成一个共享表空间。
所有基于InnoDB存储引擎的表的数据都会记录到该共享表空间。
当然,可以通过参数innodb_file_per_table=ON设置独立的表空间,这些单独的表空间仅存放表的数据、索引和插入缓冲BITMAP

5.2 重做日志文件(redo log)

记录了所有的事物。如果数据库所在主机掉电宕机,InnoDB存储引擎会通过重做日志恢复到掉电前的时刻,保证数据的完整性。
redo log和二进制文件的不同:

  1. 层次不同
    • 二进制文件 记录所有与MySQL有关的日志记录,包括InnoDB、MyISAM、Heap等其他存储引擎的日志。
    • 重做日志文件 只记录与InnoDB有关的事物日志。
  2. 内容不同
    • 二进制文件 记录的是事物的具体操作内容,该日志是逻辑日志
    • 重做日志文件 记录的是每个页的更改的物理情况(如偏移量800,写’aaa’)
  3. 写入时机不同
    • 二进制文件 只在事物Commit前写一次磁盘
    • 重做日志文件 在事物进行过程中也是不断刷到磁盘的,由Master Thread执行。

通过设置innodb_flush_log_at_trx_commit参数(0、1、2),来控制事物Commit时是否需要把缓冲中的日志刷到磁盘。

  • 0表示不将缓冲中事物的重做日志刷到磁盘,而是等Master Thread每秒刷新
  • 1表示要刷,也就是会伴有fsync的调用
  • 2表示异步写到磁盘,就是写到文件系统的缓冲中。
    所以如果这个参数设置为0或者2,宕机时可能会导致部分事物的丢失。
    但设置为2的时候,如果只是数据库崩了,操作系统没崩,恢复时同样保证数据不丢失。

猜你喜欢

转载自blog.csdn.net/kukubao207/article/details/88602042
今日推荐